在节点js中创建多个child_processes

时间:2017-08-19 08:14:44

标签: javascript node.js exe

我有这个节点js代码

var bat = null;
app.post("/api/run", function(req,res) {
    if(!bat) {
        bat = spawn('cmd.exe', ['/c App.exe']);
    }

    if(req.body.success) {
        bat.kill();
    }

    bat.stdin.write(req.body.input+'\n');

    bat.stdout.on('data', function (data) {
      console.log(data.toString());
      res.end(JSON.stringify({data: data.toString()}));
    });

    bat.stderr.on('data', function (data) {
      console.log(data.toString());
    });

    bat.on('exit', function (code) {
      bat = null;
      console.log('Child exited with code ' + code);
    });    
});

此代码假设只创建一个将运行exe文件的子进程。但是当子进程被杀死后3 ajax请求,这是在控制台输出:

Input NO: 1 You entered: input 1

Input NO: 2 You entered: input 2

Input NO: 2 You entered: input 2

Input NO: 3 You entered: input 3

Input NO: 3 You entered: input 3

Input NO: 3 You entered: input 3

Child exited with code 1
Child exited with code 1
Child exited with code 1

虽然它应该记录每次输入一次,并且应该只有一个子进程。这段代码有什么问题。
任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:2)

您只是实例化一个进程,但是您在每个请求上不断连接新的事件处理程序,这就是您获得重复输出的原因(3个请求=消息的3倍)。

.on声明

中移动if (!bat)次来电
if (!bat) {
    bat = spawn('cmd.exe', ['/c App.exe']);
    bat.stdout.on('data', function (data) {
        console.log(data.toString());
        res.end(JSON.stringify({data: data.toString()}));
    });
    bat.stderr.on('data', function (data) {
        console.log(data.toString());
    });
    bat.on('exit', function (code) {
        bat = null;
        console.log('Child exited with code ' + code);
    });
}
bat.stdin.write(req.body.input+'\n'); 

答案 1 :(得分:1)

实际上只有一个子进程,但每个请求都会为子进程添加一个exit事件侦听器。所以第二次输入显示两次,第三次显示3次。并显示Child exited 3次。

您可以尝试以下方式。

  • 在创建子进程时添加事件侦听器
  • 在发送响应后删除侦听器
  • 使用once为这些事件设置一次性侦听器

希望这可以帮到你