2016-01-23 8 views
8

Ich möchte benutzerdefinierten Stream verwenden, um child_process.spawn stdio zu behandeln.Nodejs child_process spawn benutzerdefinierte stdio

Zum Beispiel

const cp = require('child_process'); 
const process = require('process'); 
const stream = require('stream'); 

var customStream = new stream.Stream(); 
customStream.on('data', function (chunk) { 
    console.log(chunk); 
}); 

cp.spawn('ls', [], { 
    stdio: [null, customStream, process.stderr] 
}); 

ich Fehler Incorrect value for stdio stream.

Es gibt Dokumentation für child_process.spawn https://nodejs.org/api/child_process.html#child_process_options_stdio. Es sagt für STDIO Optionen, dass es Stream-Objekt nehmen kann

Stream-Objekt - Teilen Sie einen lesbaren oder schreibbaren Stream, der auf eine Tty, Datei, Socket oder eine Pipe mit dem Kindprozess verweist.

Ich denke, ich vermisse diesen "verweist auf" -Teil.

Antwort

6

Es scheint ein Fehler zu sein: https://github.com/nodejs/node-v0.x-archive/issues/4030 Die customStream scheint nicht bereit zu sein, wenn es an spawn() übergeben wird. Sie können ganz einfach, um dieses Problem zu gehen:

const cp = require('child_process'); 
const stream = require('stream'); 

// use a Writable stream 
var customStream = new stream.Writable(); 
customStream._write = function (data) { 
    console.log(data.toString()); 
}; 

// 'pipe' option will keep the original cp.stdout 
// 'inherit' will use the parent process stdio 
var child = cp.spawn('ls', [], { 
    stdio: [null, 'pipe', 'inherit'] 
}); 

// pipe to your stream 
child.stdout.pipe(customStream); 
+0

Ja, das ist etwas, das ich am Ende bin mit. Danke –

+0

Während dies eine gute Problemumgehung ist, ist das eigentliche Problem, dass STDIO-Streams einen zugrunde liegenden Dateideskriptor benötigen. Benutzerdefinierte Streams haben das nicht. – skerit

Verwandte Themen