1、Buffer
1)定义
Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,JavaScript自有的字符串远远不能满足这些需求,于是Buffer对象应运而生。
Buffer作为存在于全局对象上,无需引入模块即可使用,你绝对不可以忽略它。
可以理解Buffer是在内存中开辟的一片区域,用于存放二进制数据。Buffer所开辟的是堆外内存,不是由v8分配的,而是在Node的C++层面实现内存的申请的,最终是存在硬盘里面。
node采用slab分配机制,slab是一种动态内存管理机制
Buffer 对象占用的内存空间是不计算在 Node.js 进程内存空间限制上的,所以可以用来存储大对象,但是对象的大小还是有限制的。一般情况下32位系统大约是1G,64位系统大约是2G。
2)buffer的使用
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。
const buf = Buffer.from(‘runoob’, ‘ascii’);
console.log(buf.toString(‘hex’)); // 输出 72756e6f6f62
console.log(buf.toString(‘base64’)); // 输出 cnVub29i
创建buffer类
const buf1 = Buffer.alloc(10); // 创建一个长度为 10、且用 0 填充的 Buffer。
const buf5 = Buffer.from(‘tést’); // 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
buf = Buffer.alloc(256); //写入缓冲区
len = buf.write(“www.runoob.com”);
buf = Buffer.alloc(26); //从缓冲区读取数据
for (var i = 0 ; i < 26 ; i++) {
buf[i] = i + 97;
}
console.log( buf.toString(‘ascii’)); // 输出: abcdefghijklmnopqrstuvwxyz
Buffer.concat(list[, totalLength]) //缓冲区合并
2、stream(联合Buffer一起用)
1)定义
1】流式数据
特点就是,像流水一样,不是一次过来而是一点一点“流”过来。而你处理流式数据也是一点一点处理。如果是全部收到数据以后再处理,那么延迟会很大,而且在很多场合会消耗大量内存。
流式数据被封装成了byte流(其实也是二进制的)
2】流
流(stream)是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。
Node.js 提供了多种流对象。 例如,HTTP 服务器的请求。
所有的流都是 EventEmitter 的实例。
3】流的类型
Node.js 中有四种基本的流类型:
a、Writable - 可写入数据的流(例如 fs.createWriteStream())。
b、Readable - 可读取数据的流(例如 fs.createReadStream())。
c、Duplex - 可读又可写的流(例如 net.Socket)。
d、Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如 zlib.createDeflate())
4】常见的可写流
客户端的 HTTP 请求
服务器的 HTTP 响应
fs 的写入流
TCP socket
2)API
1】创建可读流
var readerStream = fs.createReadStream(‘input.txt’);
// 处理流事件 --> data, end, and error
readerStream.on(‘data’, function(chunk) {
data += chunk;
});
2】创建写入流
var writerStream = fs.createWriteStream(‘output.txt’);
writerStream.end();
// 处理流事件 --> finish、error
writerStream.on(‘finish’, function() {
console.log(“写入完成。”);
});
3】创建管道流
// 创建一个可读流
var readerStream = fs.createReadStream(‘input.txt’);
// 创建一个可写流
var writerStream = fs.createWriteStream(‘output.txt’);
// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);
3)应用
1】大文件读写处理、文件上传下载
直接读取大文件,不但消耗内存,而且存在延迟。通过流将大文件切割成不同的小模块,一点点地进行传输。
2】流媒体
避免将视频文件一次性返回给客户端,用流可以讲视频文件一点点的放入内存中,然后一点点的返回给客户(利用了 HTTP 协议的 Transfer-Encoding: chunked 分段传输特性),用户体验得到优化,同时对网络和内存的开销明显下降。
3、querystring
querystring 模块 用于处理HTTP请求URL中的查询字符串
1】把查询字符串解析为JS对象
var str = ‘uname=tom&upwd=1234&pno=3&kw=%E5%AD%A6%E4%B9%A0’;//查询字符串
var obj = qs.parse(str);
console.log(obj);//{ uname: ‘tom’, upwd: ‘1234’, pno: ‘3’, kw: ‘学习’ }
2】把JS对象转换为查询字符串
var obj2 = {ename:“gemini”,age:21,addr:“bj”};
var str2 = qs.stringify(obj2);
console.log(str2);//ename=gemini&age=21&addr=bj
4、url
url 模块 用于解析一个HTTP请求地址,获取其中各个不同的部分
var u = “https://qd:[email protected]:443/ad/index?uname=gemini&pno=3#chapter3”;
var obj1 = url.parse(u);
console.log(obj1);
{
protocol: ‘https:’,
slashes: true,
auth: ‘qd:123’,
host: ‘www.jd.com:443’,
port: ‘443’,
hostname: ‘www.jd.com’,
hash: ‘#chapter3’,
search: ‘?uname=gemini&pno=3’,
query: ‘uname=gemini&pno=3’,
pathname: ‘/ad/index’,
path: ‘/ad/index?uname=gemini&pno=3’,
href: ‘https://qd:[email protected]:443/ad/index?uname=gemini&pno=3#chapter3’
}
5、 fs
fs模块提供了对文件系统中的文件/目录进行增删改查、读写、监听文件变化的功能。
var data =fs.readFileSync( file ); //同步读取文件中的内容
fs.writeFileSync(file, str/buf ) //同步向文件中写出内容(删除已有内容)
6、path
path 模块提供了一些用于处理文件路径的小工具
path.resolve([from …], to)
将 to 参数解析为绝对路径,给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。
path.resolve(‘/foo/bar’, ‘./baz’); // 返回: ‘/foo/bar/baz’
7、http
HTTP模块可用于编写基于HTTP协议的客户端程序(即浏览器);也可以编写基于HTTP协议的服务器端程序(即Web服务器)
用http模块编写一个简单的Web服务器:
1)接收客户端的HTTP请求消息
2)解析客户端请求消息
3)读取客户端请求的文件
4)向客户端发送HTTP响应消息,主体就是客户端请求的文件
var server =http.createServer( );
server.listen(80);
server.on(‘request’, function(req,res){
//解析请求消息
//向客户端写出响应消息
})
8、Module
CommonJS的基础,在nodejs里面,任何一个文件都可以看做是Module的实例。
9、node.js 各大框架的对比
1)Express
Node界最老牌的Web框架,最成熟,生态最好。提供了基础的请求上下文封装,路由,中间件,模板引擎接口,静态资源服务。麻雀虽小,五脏俱全。很方便的进行扩展,大量的基于Express的框架。
其中三大内置中间件:
a、express.static(),用于处理静态资源
b、express.json(),用于解析JSON格式的请求体数据
body-parser也是用于解析请求体数据
c、express.urlencoded(),用于解析urlencoded格式的请求体数据
2)Koa
Express原班人马打造,定义为下一代Web开发框架。仅提供一个请求上下文,中间件机制,没有捆绑任何中间件。
3)egg.js
egg.js是由阿里推出的一款web企业级框架,使用koa作为底层,提供了完整的Web开发所需的组件,减少开发过程中的重复造轮子(比如一些orm,odm,socket.io)。使用了约定大于配置的理念,提供强大的插件机制,方便扩展。
4)nest.js
nest.js是一个封装了node的有规范的框架
什么是有规范?意思是必须按照它制定的一套规则来写代码,否则程序就会无法运行。学习成本稍高一点,但是后期维护与扩展会很方便。
nest属于前端ts大趋势下深度使用注解特性并提供各种增强开发体验的框架,它提供了一套完整的解决方案,包含了认证、数据库、路由、http状态码、安全、配置、请求等开箱即用的技术。
5)think.js
thinkjs 是一个基于MVC的轻量级Node.js开发框架,基于koa,里面很多特性来源于ThinkPHP。
10、node.js 常用的orm、odm
1】orm:sequelize
2】odm:mongoose