package.json:写脚本,声明依赖
包管理器:
- npm/cnpm
- yarn:
npm i yarn -g
yarn add xxx
node包前后端都可以用,比如前后端双向处理数据
前端包管理:
- bower:
npm i bower -g
bower i xxx
eg. brwer i jquery
包:
- 第三方包
- 系统包:常用
1.assert-断言(提升系统质量,参数校验等,成立无反应,不成立报错)
assert(条件,msg)
assert.deepEqual(变量,预期值,msg)
assert.deepStrictEqual(变量,预期值,msg)
2.path-路径(解析路径)
const path=require('path');
let str='/root/a/b/1.txt';
console.log(path.dirname(str));///root/a/b
console.log(path.extname(str));//.txt
console.log(path.basename(str));//1.txt
console.log(path.resolve('/root/a/b', '../c', 'build', '..', 'strict'));///root/a/c/strict
console.log(path.resolve(__dirname, 'build'));///c:/ww/5/build
__dirname: 魔术变量,不需要声明,不同文件表示不同,编译器给出的
3.url-网址(拆解和组装网址)前台组装,后台拆解
const url=require('url');
let str='http://www.bing.com:8080/a/b/1.html?a=1&a=2&a=3';
console.log(url.parse(str, true));
$ node url.js
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.bing.com:8080',
port: '8080',
hostname: 'www.bing.com',
hash: null,
search: '?a=1&a=2&a=3',
query: [Object: null prototype] { a: [ '1', '2', '3' ] },
pathname: '/a/b/1.html',
path: '/a/b/1.html?a=1&a=2&a=3',
href: 'http://www.bing.com:8080/a/b/1.html?a=1&a=2&a=3' }
4.querystring-请求数据
5.net
net——网络通信
OSI七层参考模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 会话层 > 表现层 > 应用层(HTTP)
5层模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 应用层(HTTP)
net------TCP的node实现
TCP:传输文件
UDP:适合视频直播,流畅,丢失帧
数据通信:
1.GET
2.POST
普通数据——querystring
文件数据——
// enctype="multipart/form-data"
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="file" name="f1">
<input type="submit" value="提交">
</form>
const http=require('http');
const util=require('buffer_util');
const fs=require('fs');
http.createServer((req, res)=>{
let boundary='--'+req.headers['content-type'].split('; ')[1].split('=')[1];
let arr=[];
req.on('data', buffer=>{
arr.push(buffer);
});
req.on('end', ()=>{
let buffer=Buffer.concat(arr);
//1.按照分隔符切分
let res=util.bufferSplit(buffer, boundary);
res.pop();
res.shift();
//2.每一个处理一下
res.forEach(buffer=>{
buffer=buffer.slice(2, buffer.length-2);
let n=buffer.indexOf('\r\n\r\n');
let info=buffer.slice(0, n).toString();
let data=buffer.slice(n+4);
if(info.indexOf('\r\n')!=-1){
//文件
let res2=info.split('\r\n')[0].split('; ');
let name=res2[1].split('=')[1];
let filename=res2[2].split('=')[1];
name=name.substring(1, name.length-1);
filename=filename.substring(1, filename.length-1);
fs.writeFile(`upload/${filename}`, data, err=>{
if(err){
console.log(err);
}else{
console.log('上传成功');
}
});
}else{
//普通信息
let name=info.split('; ')[1].split('=')[1];
name=name.substring(1, name.length-1);
//console.log(name);
}
//console.log(data.toString());
});
});
}).listen(8080);
POST文件 r\n换行
<分隔符>\r\n字段信息\r\n\r\n内容\r\n<分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符>--
-
1.用<分隔符>切分
[
null,
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
'--'
]
-
2.第0个和最后1个,扔掉
[
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
]
-
3.每一项扔掉头尾\r\n,切开
"字段信息\r\n\r\n内容"
"字段信息", "内容"
//二级制下完成,不能转成字符串
//buffer没有split,有slice
let buffer=new Buffer('abc\r\nddasdfafd\r\ndfaerewtwert');
function bufferSplit(buffer, delimiter){
let arr=[];
let n=0;
while((n=buffer.indexOf(delimiter))!=-1){
arr.push(buffer.slice(0, n));
buffer=buffer.slice(n+delimiter.length);
}
arr.push(buffer);
return arr;
}
console.log(bufferSplit(buffer, '\r\n').map(b=>b.toString()));
multiparty包
cnpm i multyparty
const http=require('http');
const multiparty=require('multiparty');
http.createServer((req, res)=>{
let form=new multiparty.Form({
uploadDir: './upload'
});
form.parse(req);
form.on('field', (name, value)=>{
console.log('字段:', name, value);
});
form.on('file', (name, file)=>{
console.log('文件:', name, file);
});
form.on('close', ()=>{
console.log('表单解析完成');
});
}).listen(8080);







网友评论