我有一个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)
改进了。
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,我只是美化了它。
| 归档时间: |
|
| 查看次数: |
14101 次 |
| 最近记录: |