是否有一种防火方法可以保证 Node.js 进程中的所有
stdout
和 stderr
在允许 Node.js 进程完全终止之前都已到达目的地(尽可能多)?
在某些情况下,我一直看到 stdout 和 stderr 在终止之前无法脱离 Node.js 进程。
我的想法是:
process.once('exit', function(){
// use some synchronous call to flush or drain stdout and stderr
});
有人找到了可靠的方法吗?大多数情况下我还没有看到这个问题发生,但我只是在寻找任何可能的方法来为此添加一些额外的保险。
根据我的经验,这里有一个可靠的方法来处理这个问题:
const flushStreams = () => {
return new Promise(resolve => {
// Force flush stdout
if (process.stdout.writableLength) {
process.stdout.write('', () => {
// Then flush stderr if needed
if (process.stderr.writableLength) {
process.stderr.write('', resolve)
} else {
resolve()
}
})
} else {
resolve()
}
})
}
// Handle process termination
;['SIGINT', 'SIGTERM'].forEach(signal => {
process.on(signal, async () => {
await flushStreams()
process.exit(0)
})
})
这个方法:
writableLength
由于 Node 的事件循环性质,不能 100% 保证,但这是我在生产中发现的最可靠的方法。