1、process进程对象

process 是一个全局变量,即 global 对象的属性。它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。所以习惯性的称为进程对象;

作为全局变量,它始终可供 Node.js 应用程序使用,无需使用 require()。 它也可以使用 require() 显式地访问:

const process = require('process');

process事件:

exit表示退出事件,一般在退出进程的时候触发

process.on('exit', (code) => { console.log('退出码:', code); }); console.log('进程即将退出');

beforeExit表示在退出前触发的事件,当 node 清空事件循环,并且没有其他安排时触发这个事件;通常,当没有工作被调度时,则 Node.js 进程会退出,但是在 'beforeExit' 事件上注册的监听器可以进行异步的调用,从而使 Node.js 进程继续。也就是说调用了退出事件,但是beforeExit事件能给续接上

process.on('beforeExit', (code) => { console.log('进程 beforeExit 事件的退出码: ', code); }); process.on('exit', (code) => { console.log('进程 exit 事件的退出码: ', code); }); console.log('此消息会最先显示'); // 打印: // 此消息会最先显示 // 进程 beforeExit 事件的退出码: 0 // 进程 exit 事件的退出码: 0

'warning' 事件进程警告与进程错误的相似之处,在于两者都描述了需要引起用户注意的异常条件区别在于,警告不是 Node.js 和 Javascript 错误处理流程的正式组成部分。 一旦探测到可能导致应用性能问题,缺陷或安全隐患相关的代码实践,Node.js 就可发出警告。

process.on('warning', (warning) => { console.warn(warning.name); // 打印警告名称 console.warn(warning.message); // 打印警告信息 console.warn(warning.stack); // 打印堆栈信息 });

信号事件当 Node.js 进程接收到信号时,则会触发信号事件。信号句柄会接收信号的名称('SIGINT''SIGTERM' 等)作为第一个参数。

// 开始从 stdin 读取,因此进程不会退出。 process.stdin.resume(); process.on('SIGINT', () => { console.log('接收到 SIGINT。按 Control-D 退出。'); }); // 使用单独的函数处理多个信号。 function handle(signal) { console.log(`接收到 ${signal}`); } process.on('SIGINT', handle); process.on('SIGTERM', handle); /*-----------------------------------------------------*/ process.on('SIGTERM', (signal) => { console.log('收到信号:', signal); }); process.kill(process.pid, 'SIGTERM'); // 延迟进程退出,以便执行 SIGTERM 事件的句柄 setTimeout(() => { });

process属性:

stdout标准输出流。

process.stdout.write("Hello World!" + "\n");

stderr标准错误流。

process.stderr.write('写入内容到控制台 stderr');

stdin标准输入流。

process.stdin.on('readable', () => { console.log('读取输入:', process.stdin.read()); }); process.stdin.on('end', () => { console.log('读取结束'); });

pid当前进程的进程号。

const pid = process.pid; console.log('进程ID是:', pid);

title进程名,默认值为"node",可以自定义该值。

const title= process.title; console.log('进程title是:', title);

arch当前 CPU 的架构:'arm'、'ia32' 或者 'x64'

const arch = process.arch; console.log('CPU架构是:', arch);

platform运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32'

const platform = process.platform; console.log('操作系统平台是:', platform);

process方法:

nextTick(callback)一旦当前事件循环结束,调用回调函数。process.nextTick() 会添加 callback 到下一个时间点队列。

process.nextTick(() => { console.log('下一个时间点'); }); console.log('进程即将退出');

cwd()返回当前进程的工作目录

const cwd = process.cwd(); console.log('当前工作目录是:', cwd);

exit([code])使用指定的 code 结束进程。如果忽略,将会使用 code 0。

process.on('exit', (code) => { console.log('退出码:', code); }); process.exit(1);

kill(pid[, signal])发送信号给进程. pid 是进程id,并且 signal 是发送的信号的字符串描述。信号名是字符串,比如 'SIGINT' 或 'SIGHUP'。如果忽略,信号会是 'SIGTERM'。

process.on('SIGTERM', (signal) => { console.log('收到信号:', signal); }); process.kill(process.pid); // 延迟进程退出,以便执行 SIGTERM 事件的句柄 setTimeout(() => { });

memoryUsage()返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。

const memoryUsage = process.memoryUsage(); console.log('内存使用情况:', memoryUsage);

 

2、Buffer缓冲对象

Buffer 对象用于表示固定长度的字节序列。

Buffer 类在全局作用域中,因此无需使用 require('buffer').Buffer

创建

Buffer 提供了以下 API 来创建 Buffer 类:

  • Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
  • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
  • Buffer.allocUnsafeSlow(size)
  • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
  • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
  • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例

创建指定填充的缓冲区(安全):

// 创建一个长度为 10、以零填充的 Buffer。
const buf1 = Buffer.alloc(10);

// 创建一个长度为 10 的 Buffer,
// 其中全部填充了值为 `1` 的字节。
const buf2 = Buffer.alloc(10, 1);

创建不安全的缓冲区:

// 创建一个长度为 10、且未初始化的 buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill()、write() 或其他能填充 Buffer 的内容的函数进行重写。

const buf3 = Buffer.allocUnsafe(10);

创建指定包含指定字节的缓冲区:

// 创建一个包含字节 [1, 2, 3] 的 Buffer

const buf4 = Buffer.from([1, 2, 3]);

编码

指定编码方式:

当在 Buffer 和字符串之间转换时,可以指定字符编码。 如果未指定字符编码,则使用 UTF-8 作为默认值

const buf = Buffer.from('hello world', 'utf8');
/*
Node.js 目前支持的字符编码包括:
ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
ucs2 - utf16le 的别名。
base64 - Base64 编码。
latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。
binary - latin1 的别名。
hex - 将每个字节编码为两个十六进制字符。
*/

Buffer 实例可以使用 for..of 语法进行迭代:

const buf = Buffer.from([1, 2, 3]);

for (const b of buf) {
  console.log(b);
}

3、buffer数据写入、读取

写入语法:buf.write(string[, offset[, length]][, encoding])

参数:

string-需要写入缓冲的字符串

offset:缓冲区开始写入的索引值,默认0

length:写入的字节数

encoding:使用的编码,默认utf8

buf = Buffer.alloc(256);
len = buf.write("www.runoob.com");

console.log("写入字节数 : "+  len);

读取语法:buf.toString([encoding[, start[, end]]])

参数:

encoding:表示编码格式

start:表示开始索引

end:表示结束索引

buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   //使用 'ascii' 编码, 并输出: abcde
console.log( buf.toString('utf8',0,5));    // 使用 'utf8' 编码, 并输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用默认的 'utf8' 编码, 并输出: abcde

4、Buffer的常用方法:

将 Buffer 转换为 JSON 对象

语法:buf.toJSON()

返回:JSON对象

返回 buf 的 JSON 格式。 当字符串化 Buffer 实例时,JSON.stringify() 会调用该函数。

Buffer.from() 接受此方法返回的格式的对象。 特别是, Buffer.from(buf.toJSON()) 的工作方式类似于 Buffer.from(buf)

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// 打印: {"type":"Buffer","data":[1,2,3,4,5]}

const copy = JSON.parse(json, (key, value) => {
  return value && value.type === 'Buffer' ?
    Buffer.from(value) :
    value;
});

console.log(copy);
// 打印: <Buffer 01 02 03 04 05>

//不如直接使用JSON对象来处理

缓冲区合并

语法:Buffer.concat(list[, totalLength])

返回值:一个新的Buffer对象

var buffer1 = Buffer.from(('菜鸟教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());

缓冲区比较

语法:buf.compare(otherBuffer);

返回值:返回一个数字,表示 bufotherBuffer 之前,之后或相同。

var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
   console.log(buffer1 + " 与 " + buffer2 + "相同");
}else {
   console.log(buffer1 + " 在 " + buffer2 + "之后");

拷贝缓冲区

语法:buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

参数描述如下:

targetBuffer - 要拷贝的 Buffer 对象。

targetStart - 数字, 可选, 默认: 0

sourceStart - 数字, 可选, 默认: 0

sourceEnd - 数字, 可选, 默认: buffer.length

var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');

//将 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);

console.log(buf1.toString());

缓冲区裁剪

语法:buf.slice([start[, end]])

参数描述如下:

start - 数字, 可选, 默认: 0

end - 数字, 可选, 默认: buffer.length

返回值:返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

var buffer1 = Buffer.from('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

缓冲区长度:

语法:buf.length

返回:缓冲区长度

var buffer = Buffer.from('www.runoob.com');
//  缓冲区长度
console.log("buffer length: " + buffer.length);