node.js 标准/错误输出 和 process.exit

node.js中,各种模块有一种标准的写法:

this._process.exec(command, options, function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

这里说的标准,是指回调函数,一般有err作为第一个参数,然后是具体的数据。

写服务器程序的时候,或多或少会用到child_process这个模块,而这个模块的用法正如上边代码所示。

例如调用一个shell命令删除文件,可以这样:

    child_process.exec('rm -rf xxxx', function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

返回的参数,其实err是一个对象,而stdout和stderr是字符串,stdout就是执行的子进程中使用标准输出的信息,而stderr就是子进程中错误输出流的内容。

那么问题来了,如果我们自己用node.js写一个简单脚本,让其他node程序去调用,怎么模仿实现一样的返回情况呢?

其他程序调用的时候,可能是这样:

child_process.exec('node doSomething.js', function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

如果我们在子进程中,使用console.log/error打印信息,结果,会发现,在父进程的回调函数中将什么都得不到。

奇了怪了,console.error不就是错误输出吗?好吧,这只能怪自己写web写多了,然后node.js并不是这样的。

接下来就要介绍三个玩意,分别对应stdout、stderr和err。

process.stdout.write
process.stderr.write
process.exit(非0)

write函数接受的是一个字符串,那么为了方便使用,我们可以封装一下:

console.error = function () {
    var msg = Array.prototype.join.call(arguments, ', ');
    process.stderr.write(msg);
};

最后,如果程序跑出错,除了在stderr中输出信息外,我们还可能需要立刻终止程序。

按照linux的规范,一般成功用0表示,而非0则表示失败。那么process.exit也遵循这个规范。

  • process.exit(0)表示成功完成,回调函数中,err将为null;
  • process.exit(非0)表示执行失败,回调函数中,err不为null,err.code就是我们传给exit的数字。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

〈详解〉Python3调用C程序

胶水语言 python为什么要调用c c与python对比 python不擅长"大量运算"任务; python程序优势在于:编写简单,适合"I...

2876
来自专栏gaoqin31

Linux多进程(fork)

进程概念: 一个进程是一次程序执行的过程,它和程序不同,程序是静态的,它是一些保存在磁盘上可执行的代码和数据的集合,而进程是一个动态概念,也是操作系统分配资源的...

1413
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

1053
来自专栏流媒体

dll生成和使用

932
来自专栏赵俊的Java专栏

使用 Python 操作 HDFS

2562
来自专栏鬼谷君

python3模块: sys

1533
来自专栏草根专栏

使用 Moq 测试.NET Core 应用 -- Mock 行为

第一篇文章, 关于Mock的概念介绍:https://cloud.tencent.com/developer/article/1172536

872
来自专栏java一日一条

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易...

602
来自专栏AILearning

多线程的基础学习

进程:是一个正在执行中的程序, 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:是进程中的一个独立的控制单元, 线程在控制中进...

1807
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

1724

扫码关注云+社区