Node.js基础模块

2017/2/21 Node.js

常用模块

# Buffer(缓冲区)

# 理解与使用

因为JavaScript对Unicode友好,但难以处理二进制数据。

而TCP流与文件系统经常需要操作字节流,于是在Buffer类中存储原始数据。

操作Buffer就像操作JavaScript的数组类似。 一旦创建了Buffer实例化对象,就不能改变它的大小。

因为Buffer是全局对象,所以不需要使用 “ require('buffer') ”。

var buf = new Buffer(size);
1

Buffer对象

Buffer静态方法 Buffer静态方法使用含义
poolSize 内存载体的容量
isBuffer 判断对象类型是否是Buffer
compare 用来判断两个Buffer对象的相对位置,一般做字符串排序
isEncoding 支持某种编码,中文~UTF-8
concat 连接几个Buffer对象作为一个新的Buffer对象
byteLength 指定字符串编码所占据的字符数

Buffer实例方法 Buffer实例方法使用含义
buffer[index] 根据下标确定第index个位置的内容
buffer.length 确定Buffer的长度
buffer.write(string , offser , length , encoding) 当有了string参数就可以对Buffer写入内容(长度改变的内容不会影响Buffer的长度。长了,会自动截取多余的部分;短了,仅更改部分的信息。)。offset作为起始下标位置,默认0。length表示将要写入的字符串大小。encoding是编码格式,默认'utf8'。
buffer.toString(encoding , start=0 , end=buffer.length) 输出Buffer的内容
buffer.copy(target , tStart , sStart , sEnd=buffer.length) target表示目标buffer(target)Start表示从目标Buffer的第几个字节开始写,默认是0。sStart表示原Buffer(buffer,默认是0。sEnd表示原Buffer的终止位置,默认是buffer.length。
buffer.slice(start , end) 剪切出一个新的buffer,这个buffer将会和原来的buffer引用相同的内存地址,start(默认0)、end(默认buffer.length)表示截取的索引。
buffer.compare(otherBuffer) 对比两个buffer,相同(返回0),在buf在otherBuff之前返回(-1)。
buffer.equals(otherBuffer) 对比两个buffer是否相同(返回true)
buffer.fill(value , offset , end) 用value填充整个buffer,offset(默认0)、end是(默认buffer.length)表示填充的索引

# Demo01

对照片进行base64编码方式的转换。

对照片进行base64编码方式的转换

var fs = require('fs');

fs.readFile('big.jpg',function(err,origin_buffer) {
 console.log(Buffer.isBuffer(origin_buffer));
 fs.writeFile('logo_buffer.png',origin_buffer,function (err) {
  if (err) {
   console.log(err);
  }
 })
 /*var base64Image = new Buffer(origin_buffer).toString('base64');*/
 var base64Image = origin_buffer.toString('base64');
 console.log(base64Image);

 var decodedImage = new Buffer(base64Image,'base64');
 console.log(Buffer.compare(origin_buffer,decodedImage));
 fs.writeFile('logo_decoded.png',decodedImage,function(err) {
  if (err) {
   console.log(err);
  }
 })
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 逻辑分析

Buffer,作为缓冲池,直接操作内存,上面的代码先读了一张照片,然后把照片存储在缓冲池中,然后把缓冲池中的照片编码写入到本地。

中间写了两张照片到本地,第一章是直接写入,第二章是先把照片转换为base64编码方式,然后存入缓冲池,最后在写照片的时候把编码方式为base64的这段代码转换为照片。

中间有执行报错的回调函数(err)。

# Stream(流)

# 理解

Stream就像是管道一样,是一个抽象接口,实现了操作数据时的加载方式。

对http服务器发送请求的request对象就是一个stream,还有标准输出时等。

# Demo02

查看流的运行状态与常用事件。

查看流的运行状态。

var fs = require('fs');

var readStream = fs.createReadStream('stream_copy_logo.js');
var n = 0;

readStream
 .on('data',function(chunk) {
  n++;
  console.log('data emits');
  console.log(Buffer.isBuffer(chunk));
  /*console.log(chunk.toString('utf8'));*/

  readStream.pause();
  console.log('data pause');
  setTimeout(function() {
   console.log('data pause end');
   readStream.resume();
  },2000);
 })
 .on('readable',function() {
  console.log('data readable');
 })
 .on('end',function() {
  console.log(n);
  console.log('data ends');
 })
 .on('close',function() {
  console.log('data close');
 })
 .on('error',function() {
  console.log('data read error' + e);
 })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 逻辑

这里主要创建一个读取的流,然后根据绑定不同事件来观察Stream加载文件时的状态。

常用的事件有:

data - 当有数据可读时触发。

end - 没有更多的数据可读时触发。

error - 在接收和写入过程中发生错误时触发。

finish - 所有数据已被写入到底层系统时触发。

# Net(网络通信)

# 使用