节点js中创建了多个child_processes

Multiple child_processes are created in node js

我有这个节点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

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

你只是在实例化一个进程,但你不断地在每个请求上连接新的事件处理程序,这就是你得到重复输出的原因(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'); 

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

您可以尝试以下方法。

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

希望对您有所帮助