2020-04-17
Node
0

目录

process
process.stdin、process.stdout
基础事件
beforeExit
exit
disconnect
message
warning
信号事件
处理异常的事件
multipleResolves
unhandledRejection
rejectionHandled
uncaughtException
常用方法
process.chdir()
process.cwd()
process.cpuUsage()
process.memoryUsage()
process.exit()
process.kill()
process.nextTick
常用属性
process.argv
process.argv0
process.execArgv
process.connected
process.exitCode
process.platform
process.pid
process.ppid

本篇对Node process 进行深入了解

process

process.stdin、process.stdout

输入、输出流

创建文件夹例子

js
const fs=require('fs') process.stdout.write('请输入项目名称:') process.stdin.setEncoding('utf-8') process.stdin.on('data',function(e){ fs.mkdirSync(e.toString().replace(/(\r\n)|(\n)/g,'')) process.stdout.write('项目创建成功\n') process.nextTick(()=>{ process.exit() }) })

基础事件

beforeExit

对于导致显式终止的条件,不会触发 'beforeExit' 事件,例如调用 process.exit() 或未捕获的异常。在回调里面异步调用函数,进程会被维持

exit

  • 显式调用 process.exit() 方法;
  • Node.js 事件循环不再需要执行任何其他工作。
  • 监听器函数必须只执行同步操作。 在调用 'exit' 事件监听器之后,Node.js 进程将立即退出,从而导致在事件循环中仍排队的任何其他工作被放弃。
js
process.on('beforeExit', (code) => { console.log('进程 beforeExit 事件的代码: ', code); }); process.on('exit', (code) => { console.log('进程 exit 事件的代码: ', code); }); console.log('此消息最新显示');

disconnect

message

warning

信号事件

处理异常的事件

multipleResolves

只要 Promise 有以下情况,就会触发 'multipleResolves' 事件

  • resolve不止一次
  • reject不止一次
  • resolve后reject
  • reject后resolve
js
process.on('multipleResolves', (type, promise, reason) => { console.error(type, promise, reason); setImmediate(() => process.exit(1)); }); async function main() { try { return await new Promise((resolve, reject) => { resolve('第一次调用'); resolve('吞没解决'); reject(new Error('吞没解决')); }); } catch { throw new Error('失败'); } } main();

unhandledRejection

如果在事件循环的一次轮询中,一个 Promise 被拒绝,并且此 Promise 没有绑定错误处理器, 'unhandledRejection 事件会被触发

js
process.on('unhandledRejection', (reason, promise) => { console.log('未处理的拒绝:', promise, '原因:', reason); // 记录日志、抛出错误、或其他逻辑。 }); new Promise((resolve,reject)=>{ reject('失败') })

rejectionHandled

每当 Promise 被拒绝并且错误处理函数附加到它(例如,使用 promise.catch())晚于一个 Node.js 事件循环时,就会触发 'rejectionHandled' 事件

js
const unhandledRejections = new Map(); process.on('unhandledRejection', (reason, promise) => { console.log('unhandledRejection') unhandledRejections.set(promise, reason); }); process.on('rejectionHandled', (promise) => { console.log('rejectionHandled') unhandledRejections.delete(promise); }); let p=new Promise((resolve,reject)=>{ reject(10) }) setImmediate(()=>{ p.catch(()=>{ }) })

uncaughtException

当未捕获的 JavaScript 异常一直冒泡回到事件循环时,会触发 'uncaughtException' 事件。出现异常,没有错误,默认是以错误码1直接退出,设定此函数进程将会依然被保持

js
let fs=require('fs') process.on('uncaughtException', (err, origin) => { fs.writeSync( process.stderr.fd, `捕获的异常: ${err}\n` + `异常的来源: ${origin}\n` ); }) setTimeout(() => { console.log('这里仍然会运行') process.exit(20) }, 1500) setInterval(()=>{ console.log('进程依然在继续') },500) process.on('exit',(code)=>{ console.log('错误代码',code) }) // 故意引起异常,但不要捕获它。 nonexistentFunc() console.log('这里不会运行')

常用方法

process.chdir()

修改工作目录

js
process.chdir(directory)

process.cwd()

返回当前工作目录

js
console.log(`Starting directory: ${process.cwd()}`); try { process.chdir('/usr'); console.log(`New directory: ${process.cwd()}`); } catch (err) { console.error(`chdir: ${err}`); }

process.cpuUsage()

返回Node.js 进程的内存使用情况,上一次调用 process.cpuUsage() 方法的结果,可以作为参数值传递给此方法,得到的结果是与上一次的差值

js
process.cpuUsage([previousValue]) const startUsage = process.cpuUsage(); // { user: 38579, system: 6986 } // 将 CPU 旋转 500 毫秒。 const now = Date.now(); while (Date.now() - now < 500); console.log(process.cpuUsage(startUsage)); // { user: 514883, system: 11226 }

process.memoryUsage()

返回 Node.js 进程的内存使用情况

js
process.memoryUsage() console.log(process.memoryUsage());

process.exit()

退出进程

js
process.exit([code])

process.kill()

根据进程id,杀死进程

js
process.kill(pid[, signal]) console.log(process.pid) setInterval(()=>{ },100) process.kill(process.pid, 'SIGKILL');

process.nextTick

将一个函数推迟到当前执行栈执行完毕之后立即执行,而不是在异步任务队列中排队等待执行

js
process.nextTick(callback[, ...args])

常用属性

process.argv

第一个元素是 process.execPath。 第二个元素将是正在执行的 JavaScript 文件的路径。 其余元素将是任何其他命令行参数

process.argv0

process.execPath

process.execArgv

属性返回当 Node.js 进程被启动时,Node.js 特定的命令行选项

js
console.log(process.argv) //[ '/Users/ccz/.nvm/versions/node/v12.14.0/bin/node', '/Users/ccz/Public/student-project/cs/vue-cs-3.0/a2.js', '-a', '-b=100' ] console.log(process.argv0) ///Users/ccz/.nvm/versions/node/v12.14.0/bin/node console.log(process.execArgv) //[ '--harmony' ]

process.connected

一旦 process.connected 为 false,则不能通过 IPC 通道使用 process.send() 发送信息

process.exitCode

当进程正常退出,或通过 process.exit() 退出且未指定退出码时,此数值将作为进程的退出码。指定 process.exit(code) 的退出码将覆盖 process.exitCode 的原有设置

process.platform

标识 Node.js 进程运行其上的操作系统平台

process.pid

返回进程的 PID

process.ppid

返回当前父进程的 PID

本文作者:BARM

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!