在结束之前写入流式传输'事件被解雇

时间:2016-04-21 03:24:16

标签: node.js node.js-stream

我正在使用几个带有Node.js父进程的child_process,并且我将所有stderr从子进程传递到一个文件。

像这样:

    const strmPath = path.resolve(projRoot + '/suman/stdio-logs/runner-stderr.log');
    const strm = fs.createWriteStream(strmPath);


    //before I call pipe I write some stuff to the log file
    strm.write('\n\n>>> Suman start >>>\n');
    strm.write('Beginning of run at ' + Date.now() + ' = [' + new Date() + ']' + '\n');
    strm.write('Command = ' + JSON.stringify(process.argv) + '\n');


    // when the parent process exits, I want to write one more line to the log file

    process.on('exit', function (code, signal) {

        strm.write('<<<<<< Suman runner end <<<<<<\n');


    });
在父进程中的

我将数据传输到文件中,如下所示:

    const n = cp.fork(path.resolve(__dirname + '/run-child.js'), argz, {silent: true});


    n.on('message', function (msg) {
        handleMessage(msg, n);
    });


    n.stdio[2].setEncoding('utf-8');
    n.stdio[2].pipe(strm);
问题是&#39;结束&#39;在process.on(&#39; exit&#39;)发生之前,事件在流上触发。实际上似乎没有办法在流式传输之前将其写入流中并结束#39;叫做;好吧,实际上我正在寻找一种方法来挂钩流,以便在调用end之前,我至少可以写一次。

有办法做到这一点吗?

(顺便说一句,我也在寻找一种方法将child_process stderr流直接传递给文件而不必先通过父进程。我可以通过简单地在每个进程中调用process.stderr.pipe()来做到这一点。 child_process

1 个答案:

答案 0 :(得分:1)

这可能会有所帮助:

strm关闭时,会阻止n.stdio[2]自动关闭。因此,您可以使用最后一块块手动结束strm流。

n.stdio[2]
.on('end', function(){
  strm.end('<<<<<< Suman runner end <<<<<<\n');
})
.pipe(strm, {end: false})