我试图了解 node.js 中的子进程模块,我创建了一个包含代码的父文件:
var spawn=require("child_process").spawn;
var child=spawn("node",['plus_one.js']);
setInterval(function(){
//var number=Math.floor(Math.random()*10000);
var number=10;
child.stdin.write(number + "\n");
child.stdout.once("data",function(data){
console.log("Child replied to "+number + " with " + data);
})
},1000);
child.stderr.on("data",function(data){
//process.stdout.write(data);
console.log("error"+data)
})
子文件如下所示:
process.stdin.resume();
process.stdin.on("data",function(data){
var number;
try{
number = parseInt(data.toString(), 10);
number+=1;
process.stdout.write(number+"\n");
}
catch(err){
process.stderr.write(err.message+"lol");
}
})
如果我只执行子文件,它可以正常工作,但是当我执行主文件时,它总是返回NaN
;那是为什么?
另外,当我试图理解它时,我完全不理解child_process.spawn
和.exec
之间的区别,spawn
返回 stream 所以它有stdin / stdout exec
返回缓冲区,是否意味着.exec
无法与子文件通信(反之亦然),而不是传递带有options / env对象的变量?
答案 0 :(得分:0)
对您的代码进行一些调整,现在它正在为我工作:
var spawn = require("child_process").spawn;
var child = spawn("node", ['plus_one.js']);
var number = 10;
setInterval(function () {
child.stdin.write(number++ + "\n");
child.stdout.once("data", function (data) {
console.log("Child replied to " + number + " with " + data);
});
}, 1000);
child.stderr.on("data", function (data) {
//process.stdout.write(data);
console.log("error" + data)
});
的变化:
setInterval()
函数上使用了正确的支撑。.once()
,以便事件处理程序不会堆积。number
变量移到setInterval()
范围之外,以便它可以从一次调用到下一次调用保留其值。