全局对象 process

::: success process 是一个全局对象,即 global 对象的下的一个属性。用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。通常在你写本地命令行程序的时候,少不了要 和它打交道。 :::

常用属性和方法

process.version // 当前Node版本
process.platform // 系统平台
process.arch // 系统架构
process.cwd() // 当前目录
process.chdir('/tmp') // 切换目录

process.nextTick()

process.nextTick()将在下一轮事件循环中调用

process.nextTick(function () {
  console.log('nextTick callback!');
});
console.log('nextTick was set!');

运行结果为:

nextTick was set!
nextTick callback!

Process 事件

process 对象是EventEmitter的实例.

事件 描述
exit 当进程准备退出时触发。
beforeExit 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。
uncaughtException 当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
Signal 当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。

Event: exit

两种情况下 exit 事件会被触发:

  • 显式调用process.exit()方法,使得Node.js进程即将结束;
  • Node.js事件循环数组中不再有额外的工作,使得Node.js进程即将结束。

在上述两种情况下,没有任何方法可以阻止事件循环的结束,一旦所有与exit事件绑定的监听器执行完成,Node.js的进程会终止。

TIP

exit事件监听器的回调函数,只有一个入参,这个参数的值可以是process.exitCode的属性值,或者是调用process.exit()方法时传入的exitCode值。

例如

process.on('exit', code => {
  console.log('退出码为:', code);
});
console.log("程序执行结束");

运行结果为

程序执行结束
退出码为: 0

TIP

exit事件监听器的回调函数,只允许包含同步操作。所有监听器的回调函数被调用后,任何在事件循环数组中排队的工作都会被强制丢弃,然后Nodje.js进程会立即结束。 例如在下例中,timeout操作永远不会被执行(因为不是同步操作)。

例如

process.on('exit', () => {
  // 以下代码永远不会执行
  setTimeout(function() {
    console.log("该代码不会执行");
  }, 0);
});

手动指定退出码

可以使用 process.exit(code) 手动结束进程,并指定退出码。

process.on('exit', function(code) {
  console.log('退出码为:', code);
});
console.log("程序执行结束1"); // 执行
process.exit(100) // 手动指定退出码
console.log("程序执行结束2"); // 不执行

执行结果为

程序执行结束1
退出码为: 100

可以看到,手动指定进程结束后,后面的代码将不执行。

退出状态码

退出状态码如下表所示:

状态码 名称 & 描述
0 默认退出码,正常退出
1 Uncaught Fatal Exception有未捕获异常,并且没有被域或 uncaughtException 处理函数处理。
2 Unused保留
3 Internal JavaScript Parse ErrorJavaScript的源码启动 Node 进程时引起解析错误。非常罕见,仅会在开发 Node 时才会有。
4 Internal JavaScript Evaluation FailureJavaScript 的源码启动 Node 进程,评估时返回函数失败。非常罕见,仅会在开发 Node 时才会有。
5 Fatal ErrorV8 里致命的不可恢复的错误。通常会打印到 stderr ,内容为: FATAL ERROR
6 Non-function Internal Exception Handler未捕获异常,内部异常处理函数不知为何设置为on-function,并且不能被调用。
7 Internal Exception Handler Run-Time Failure未捕获的异常, 并且异常处理函数处理时自己抛出了异常。例如,如果 process.on('uncaughtException') 或 domain.on('error') 抛出了异常。
8 Unused保留
9 Invalid Argument可能是给了未知的参数,或者给的参数没有值。
10 Internal JavaScript Run-Time FailureJavaScript的源码启动 Node 进程时抛出错误,非常罕见,仅会在开发 Node 时才会有。
12 Invalid Debug Argument 设置了参数--debug 和/或 --debug-brk,但是选择了错误端口。
128 Signal Exits如果 Node 接收到致命信号,比如SIGKILL 或 SIGHUP,那么退出代码就是128 加信号代码。这是标准的 Unix 做法,退出信号代码放在高位。

接收命令行参数

process.argv 属性返回一个数组,这个数组包含了启动Node.js进程时的命令行参数。第一个元素为process.execPath。如果需要获取argv[0]的值请参见 process.argv0。第二个元素为当前执行的JavaScript文件路径。剩余的元素为其他命令行参数。

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});

使用自定义参数运行脚本:

$ node test name qzy
0: C:\Program Files\nodejs\node.exe
1: D:\projects\node-test\test
2: name
3: qzy

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress