使用日志消息退出node.js脚本的正确方法是什么?

nab*_*nab 13 node.js

我有一个node.js脚本,它使用WriteStream对文件进行一些日志记录.在某些事件上,我想停止执行脚本,即警告记录并在此之后立即退出.asyncronious node.js不允许我们直接这样做:

#!/usr/local/bin/node

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', { flags: 'a' });

stream.write('Something bad happened\n');
process.exit(1);
Run Code Online (Sandbox Code Playgroud)

而不是将消息附加到delme.log,此脚本不会对该文件执行任何操作.处理'退出'事件和刷新不起作用.写了这么远exitting发现之前的最后一个日志消息的唯一途径是包装process.exit(1)setTimeout():

#!/usr/local/bin/node

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', { flags: 'a' });

stream.write('Something bad happened\n');
setTimeout(function(){
  process.exit(1);
}, 30);
Run Code Online (Sandbox Code Playgroud)

但是在这种形式下,它不会立即停止脚本执行,并且在关键事件发生后脚本将运行一段时间.所以我想知道是否还有其他方法可以通过日志消息退出脚本?

fen*_*ent 13

既然你想要阻止,并且已经在使用流,你可能想要自己处理写作.

var data = new Buffer('Something bad happened\n');
fs.writeSync(stream.fd, data, 0, data.length, stream.pos);
process.exit();
Run Code Online (Sandbox Code Playgroud)


zup*_*upa 5

改进了。

var fs = require('fs');
var stream = fs.createWriteStream('delme.log', {flags: 'a'});

// Gracefully close log
process.on('uncaughtException', function () {
    stream.write('\n'); // Make sure drain event will fire (queue may be empty!)
    stream.on('drain', function() {
        process.exit(1);
    });
});

// Any code goes here...
stream.write('Something bad happened\n');
throw new Error(SOMETHING_BAD);
Run Code Online (Sandbox Code Playgroud)

try-catch 块可以工作,但很难看。不过,感谢@nab,我只是美化了它。