【问题标题】:NodeJs spawn giving ENOENT error (Raspbian)NodeJs 产生 ENOENT 错误(Raspbian)
【发布时间】:2016-04-15 07:35:10
【问题描述】:

我在生成 nodeJs 脚本时遇到错误:

exec('node ./modules/buttons', function(error, stdout, stderr) {
  if(error) console.log(error);
  console.log(stdout);
  if(stderr) console.log(stderr);
});

Exec 运行良好。然而spawn

var buttons = spawn('node ./modules/buttons.js', []);
buttons.stdout.on('data', function(data){
  console.log(data);
});

给我以下错误:

spawn node ./modules/buttons.js ENOENT

定义脚本的绝对路径会导致同样的错误。如果有人可以帮助我解决这个问题,将不胜感激;我完全不知道这可能是什么原因,谷歌也没有帮助我。

【问题讨论】:

    标签: node.js child-process


    【解决方案1】:

    exec 接受要执行的命令以及所有命令行参数,但 spawn OTOH 接受要调用的程序和作为数组的命令行参数。

    在您的情况下,Node.js 正在尝试执行一个名为 node ./modules/buttons.js 的程序,而不是使用 ./modules/buttons.js 作为命令行参数的 node。这就是它失败的原因。

    引用spawn 文档中的示例,

    const spawn = require('child_process').spawn;
    const ls = spawn('ls', ['-lh', '/usr']);
    

    execspawn 之间的区别在于,exec 将默认在 shell 中启动命令,spawn 只是调用程序。

    注意:顺便说一句,由于您只是在调用 JavaScript 文件,因此最好使用 execFile

    【讨论】:

    • exec 和 execfile 不会做我想做的事。我想从运行 while true 循环的buttons.js 脚本中捕获标准输出。由于消息侦听器,Spawn 应该能够帮助我解决这个问题。不过感谢您的回答;我猜我没有很好地阅读文档;)
    • 您是否尝试按照我引用的示例进行操作?
    • 是的,它有效;谢谢。但是现在我遇到了一个问题,它只在短时间内捕获生成脚本的标准输出。过了一会儿它就停止了(尽管脚本继续运行)它似乎也被其他产生的孩子的输入抵消了。奇怪的问题;不知道是什么原因造成的,但我得到了产卵工作。谢谢
    • @NickyRomeijn Cool :-) 如果对您有帮助,请考虑 accepting this answer。我们可以把这个问题放在一个单独的问题中,这样这个问题的重点就不会被淡化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2014-09-25
    • 2015-01-04
    • 2017-10-23
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多