node
-
--save-dev表示开发过程中的依赖(glup),线上运行并不需要使用
-
npm install --production 安装所有的项目依赖
-
npm init -y 自动生成package.json文件
node
node:一个代码运行环境,全局对象是globol
通过node ”./路径名“在cmd上运行代码
系统fs文件操作
1、读取文件
//通过模块的名字fs对模块进行引用
const fs = require('fs')
fs.readFile("文件路径","utf-8",(err,doc)=>{
//如果文件读取发生错误,参数err的值为错误对象,否则err的值为null
//doc:文件内容
if(err == null){
console.log(doc)
}
})
2、写入文件内容
const fs = require('fs')
fs.writeFile('./demo.txt','写 入文件的内容',err=>{
if(err!=null){
console.log(err),
return
}
console.log('文件写入成功')
})
3、路径拼接语法
//导入path模块
const path = require('path')
//对路径进行拼接
let finialPath = path.join('itcast','a','c.css')
//输出结果为itcast/a/c.css
console.log(finialPath)
4、绝对路径的修改
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname,'01.helloworld.js'),'utf8',(err,doc)=>{
console.log(err)
console.log(doc)
})
第三方模块|ctrl+c终止终端操作
npm install formidable
npm uninstall formidable
//nodemon可以使得文件修改后也可以在控制台(cmd)同步修改
npm install nodemon -g 全局安装nodemon
nodemon + 文件名 //操作文件
服务器
-
通过req.headers获取请求报文对象,一般会用到req.headers["accept"]
-
响应报文(请求成功):res.writeHead(200,{ 'content-type':'text/html;charset=utf8'})
-
响应报文(重定向): res.writeHead(301,{Location: '/list'})
创建web服务器
const http =require('http'); //引入系统模块
const url = require('url'); //获取完整地址
const app = http.createServer();//创建web服务器
//监听客户端发送请求 req:请求对象,res:响应对象
app.on('request',(req,res)=>{
req.headers//请求报文
res.end('<h1>相应内容</h1>') //提示响应完成
});
//监听3000端口
app.listen(3000)
GET&POST
GET:获取数据, 参数在req.url中获取
POST:添加/发送数据,更加 安全,参数通过data和end事件接受的
get请求数据
const url = require('url'); //通过url.parse方法处理请求地址
let {pathname,query} = url.parse(req.url,ture)
post请求数据
const querystring = require('querystring')
let postParams = ''
req.on('data',params=>{ //params参数中保存了post的url数据
postParams += params
})
req.on('end',()=>{
let query = querystring.parse(postParams)
})
res.end('ok')//发送完成报文
req.method
//req.method获取请求方式
if(req.method == 'GET'){
res.end('get')
}else if(req.method == 'POST'){
res.end('post')
}
req.url
//req.url获取请求地址,返回默认'/'
if(pathname == '/index' ||req.url == '/'){
res.end('<h2>欢迎你</h2>home')
}else if(pathname == '/list'){
res.end('list')
}else{
res.end('not found')
}
异步
异步代码只有通过参数(回调函数)获取返回值
async
-
普通函数定义前加上async关键字就成了异步函数
-
异步函数返回值是一个promise对象,
-
async中的return的参数就是promise中的resolve,throw就是reject
//const fn = async ()=>{};
async function fn(){
throw '这是原本reject的err'
return '这是原本resolve的data'
}
fn().then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
await
-
await关键字只能出现在异步函数中
-
await后边只能跟promise对象
-
await只能等promise返回结果后才能只能下一个异步任务(使异步变同步依次执行)
async function fn1() {
return 11
}
async function fn2() {
return 22
}
async function fn3() {
return 33
}
async function run() {
let p1 = await fn1()
let p2 = await fn2()
let p3 = await fn3()
console.log(p1,p2,p3);
}
run()
服务器端
-
ip地址:互联网中设备的唯一标识 (192.168.1.1)
-
域名:因为ip地址太难记出现的产物,上网使用的地址(http://127.0.0.1)
-
端口:不同的端口号为服务器提供不同的服务(80)
路由|静态资源
获取路由对象
调用路由对象创建路由
启用路由
//引入路由模块/静态资源
const getRouter = require('router')
const serveStatic = require('serve-static')
//获取路由对象
const router = getRouter()
//创建静态资源方法,需要指定访问目录
const serve = serveStatic('public绝对路径')
router.get('/add',(req,res)=>{
res.end('hello wordl')
})
//当客户端访问服务器时
app.on('request',(req,res)=>{
router(req,res,()=>{})
serve(req,res,()=>{})
})
stream流
文件写入流 fs
createWriteStream
let ws = fs.createWriteStream('./test_dir/a.tex',{encoding:'utf-8'})
ws.on('open',(data)=>{
console.log('open事件开始',data);
})
ws.on('ready',(err)=>{
console.log('ready',err);
})
//ws.end后调用
ws.on('close',(err)=>{
console.log('close',err);
})
//批次写入
ws.write('hello text!',(err)=>{
if(err){
console.log(err);
}else{
console.log('写入成功');
}
})
//批次写入
ws.write('hello text!',(err)=>{
if(err){
console.log(err);
}else{
console.log('写入成功');
}
})
ws.end()
批次写入语法糖rs.pipe(ws)
createReadStream
let rs = fs.createReadStream('./test_dir/dy.mp4',{flags:'r'})
let ws = fs.createWriteStream('./test_dir/dy_copy.mp4')
rs.on('open',(data)=>{
console.log(data);
})
//批次读取
rs.on('data',function (chunk) {
//批次写入
ws.write(chunk,(err)=>{
console.log(err);
})
console.log(d,d.length);
})
http协议

浙公网安备 33010602011771号