如何在 node.js 上调试“错误:生成 ENOENT”?

新手上路,请多包涵

当我收到以下错误时:

 events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:1000:11)
    at Process.ChildProcess._handle.onexit (child_process.js:791:34)

我可以按照什么程序来修复它?

作者注:这个错误的很多问题鼓励我发布这个问题以供将来参考。

相关问题:

原文由 laconbass 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

如何研究引发错误的 spawn 调用:

已知的常见原因

  1. 环境问题

    • 系统中不存在命令可执行文件(未安装依赖项)。 prominc的回答
    • 该命令可执行文件不存在于由 PATH 环境变量指定的目录中。
    • 可执行二进制文件是使用不兼容的库编译的。 达尼洛-拉米雷斯的回答
  2. 仅限 Windows 的错误/怪癖

  3. 错误 spawn('command', ['--argument', 'list'], { cwd, env, ...opts }) 用法

    • 指定的工作目录( opts.cwd )不存在· leeroy-brun 的回答
    • 命令中的参数列表 Stringspawn('command --wrong --argument list')
    • 命令字符串中的环境变量spawn('ENV_VAR=WRONG command')
    • 参数列表 Array 指定为 Stringspawn('cmd', '--argument list')
    • PATH 变量spawn('cmd', [], { env: { variable } } => spawn('cmd', [], { env: { ...process.env, variable } }

ENOENT 有两个可能的来源:

  1. 您正在编写的代码
  2. 你依赖的代码

当源代码是您依赖的代码时,通常的原因是 环境问题(或 Windows 怪癖)


原文由 laconbass 发布,翻译遵循 CC BY-SA 4.0 许可协议

注意:此错误几乎总是由命令不存在、工作目录不存在或仅限于 Windows 的错误引起。

我找到了一种特别简单的方法来了解以下问题的根本原因:

 Error: spawn ENOENT

这个错误的问题是,错误消息中很少有信息告诉你调用点在哪里,即找不到哪个可执行文件/命令,特别是当你有一个很大的代码库,其中有很多 spawn 调用.另一方面,如果我们知道导致错误的确切命令,那么我们可以按照 @laconbass 的回答 来解决问题。

我找到了一种非常简单的方法来发现导致问题的命令,而不是像@laconbass 的回答中建议的那样在代码中的任何地方添加事件监听器。关键思想是用包装器包装原始的 spawn 调用,该包装器打印发送到 spawn 调用的参数。

这是包装函数,将其放在 index.js 或任何服务器启动脚本的顶部。

 (function() {
    var childProcess = require("child_process");
    var oldSpawn = childProcess.spawn;
    function mySpawn() {
        console.log('spawn called');
        console.log(arguments);
        var result = oldSpawn.apply(this, arguments);
        return result;
    }
    childProcess.spawn = mySpawn;
})();

然后下次运行应用程序时,在未捕获的异常消息之前,您将看到类似这样的内容:

 spawn called
{ '0': 'hg',
  '1': [],
  '2':
   { cwd: '/* omitted */',
     env: { IP: '0.0.0.0' },
     args: [] } }

这样你就可以很容易地知道实际执行的命令是什么,然后你可以找出为什么nodejs找不到可执行文件来解决问题。

原文由 Jiaji Zhou 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题