我有这个节点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
虽然它应该记录每次输入一次,并且应该只有一个子进程。这段代码有什么问题。
任何帮助将不胜感激。感谢
答案 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
为这些事件设置一次性侦听器希望这可以帮到你