子进程spawn返回NaN

时间:2015-08-02 18:56:44

标签: javascript node.js

我试图了解 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对象的变量?

1 个答案:

答案 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)
});

的变化:

  1. setInterval()函数上使用了正确的支撑。
  2. 在适当的位置使用.once(),以便事件处理程序不会堆积。
  3. number变量移到setInterval()范围之外,以便它可以从一次调用到下一次调用保留其值。