19

例如,我正在使用以下代码(名为 server.js)在节点(我正在使用 Windows)中运行最基本的 webServer:

    var http = require('http');
       http.createServer(function (req, res) {
         res.writeHead(200, {'Content-Type': 'text/plain'});
         res.end('Hello World\n');
       }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');

我想将其作为子进程运行,并通过以下方式成功运行:

var exec = require('child_process').exec;
var serv = exec('node server.js', function(error, stdout, stderr){
    console.log('outputs & errors:' + error, stdout, stderr);
});

但是,一旦我运行第二个文件,我什么也没有收到。没有“输出和错误”,没有“服务器运行在...”。如果我在浏览器中键入 localhost:1337,我会得到“hello world”,所以我知道它正在运行。有没有办法通过管道传输“服务器正在运行......”所以我可以“确定”它正在监听?

4

3 回答 3

29

Exec 将返回STDOUTSTDERR当孩子完成时,请参阅exec. 这就是服务器启动时看不到任何输出的原因。

您想要的是fork,它会自动将子进程连接STDOUTSTDERR您的父进程。如果您的子进程是节点进程,这是首选方式。

如果你想使用 exec 你可以使用子进程的流来获取你的数据,例如:

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
于 2013-03-06T21:03:23.810 回答
2
var child_process = nw.require('child_process');
var spawn = child_process

//以下是在windows上,我将stdout和stderr记录到我的记录器中

var proc = spawn('cmd.exe', ['/S', '/C', script_path]);
proc.stdout.on('data', function(data) {
       logger(logtag, 'proc_stdout: ' + data);
});

proc.stderr.on('data', function(data) {
    logger(logtag, 'proc_stderr: ' + data);
});
于 2016-09-08T11:49:12.387 回答
1

只需指定您希望子进程继承父进程的 stdio:

require('child_process').exec('node server.js', { stdio: 'inherit' });
于 2019-12-18T18:47:24.663 回答