当前位置: 首页 > 知识库问答 >
问题:

如何在node.js上调试“error:spawn enoent”?

阎安邦
2023-03-14
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)

作者注:这个错误的许多问题鼓励我张贴这个问题,以供将来参考。

相关问题:

  • 使用node_env=production的spawn函数
  • node.js child_process.spawn ENOENT error-仅在supervisord
  • 生成ENOENT Node.js错误
  • https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
  • Grunt任务中的节点js-child_process spawn('npm install')导致Enent错误
  • 运行“Foreman”任务错误:spawn enoent
  • 节点js中未处理的错误事件error:在errnoException(child_process.js:975:11)
  • node.js spookyjs:执行hello.js时出错
  • https://stackoverflow.com/questions/26572214/run-grunt-on-a-directory-nodewebkit
  • 使用子进程节点运行exe文件
  • 节点:child_process.spawn不在Java上工作,即使它在路径(ENOENT)
  • 使用NodeJS(PYTHON相关)生成ENOENT错误
  • 图像大小调整在node.js(partial.js)(未安装的依赖项)中不工作
  • NPM安装错误(生成依赖项问题)
  • 无法在Windows 7上安装node.js-oracle模块(生成依赖项问题)
  • 在windows上使用nodejs安装gulp时出错(奇怪的情况)

共有2个答案

劳夕
2023-03-14

首先,查看child_process.spawn(命令、参数、选项)的文档:

使用给定的命令启动新进程,命令行参数在args中。如果省略,args默认为空数组。

第三个参数用于指定附加选项,默认为:

{cwd:undefined,env:process.env}

使用env指定对新进程可见的环境变量,默认值为process.env

确保您没有在command中放入任何命令行参数,并且整个spawn调用有效。继续下一步。

在源代码上搜索对spawnchild_process.spawn的每次调用,即。

spawn('some-command', [ '--help' ]);

并为“error”事件附加一个事件侦听器,这样您就会注意到将其抛出为“unhandled”的事件发射器。调试后,可以移除该处理程序。

spawn('some-command', [ '--help' ])
  .on('error', function( err ){ throw err })
;

html" target="_blank">执行,您应该得到文件路径和行号,您的'error'侦听器是在那里注册的。类似于:

/file/that/registers/the/error/listener.js:29
      throw err;
            ^
Error: spawn ENOENT
    at errnoException (child_process.js:1000:11)
    at Process.ChildProcess._handle.onexit (child_process.js:791:34)

如果前两行是静止的

events.js:72
        throw er; // Unhandled 'error' event

再次执行此步骤,直到它们不是。在继续下一步之前,必须标识发出错误的侦听器。

有两种可能的情况:

  1. 您依赖于默认的spawn行为,因此子进程环境将与process.env相同。
  2. 您将env对象明确地传递给options参数的spawn

在这两种情况下,都必须检查生成的子进程将使用的环境对象上的path键。

场景1示例

// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);

场景2示例

var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });

缺少path(即undefined)将导致spawn发出enoent错误,因为除非是可执行文件的绝对路径,否则不可能找到任何命令

正确设置path后,继续下一步。它应该是一个目录,或目录列表。最后一种情况是常见的。

如果文件名命令(即'some-command')在path上定义的至少一个目录中不存在,则Spawn可能会发出enoent错误。

找到命令的确切位置。在大多数linux发行版上,这可以通过whice命令从终端完成。它将告诉您可执行文件的绝对路径(如上),或者告诉您是否未找到该文件。

找到命令时which及其输出的用法示例

> which some-command
some-command is /usr/bin/some-command

未找到命令时which及其输出的用法示例

> which some-command
bash: type: some-command: not found

未安装的程序是not found命令最常见的原因。如果需要,请参阅每个命令文档并安装它。

当命令是一个简单的脚本文件时,确保可以从路径上的目录访问它。如果不是,要么把它移动到一个,要么做一个链接到它。

一旦您确定path设置正确,并且command可以从其中访问,您就应该能够生成您的子进程,而不会抛出spawnenoent

隆兴修
2023-03-14

注意:这个错误几乎总是因为命令不存在,因为工作目录不存在,或者是因为Windows仅有的bug造成的。

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

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为什么找不到可执行文件来修复问题。

 类似资料:
  • 问题内容: 当我得到以下错误: 我可以按照什么程序来修复它? 作者注意 :许多与此错误有关的问题鼓励我发布此问题以供将来参考。 问题答案: 使用NODE_DEBUG = child_process,向@ karl-richter积分。 简单,快速,2019年10月 用包装纸装饰,@ @ jiaji-zhou。 简单,快捷,2015年1月 漫长的过程,归功于@laconbass。 复杂,耗时,201

  • 问题内容: 我正在使用Socket.io运行Express.js应用程序用于聊天Web应用程序,并且在24小时内大约5次随机收到以下错误。节点进程将被永久封装,并立即重新启动。 问题是重新启动Express会使我的用户离开他们的房间,而没人希望这样做。 Web服务器由HAProxy代理。仅使用websockets和flashsockets传输就没有套接字稳定性问题。我无法有意复制此内容。 这是No

  • 问题内容: 我有以下代码从终端捕获^ C并正常关闭Express应用程序: 但是,如果我使用来启动节点实例,那么上面的代码将无法停止检查器和Chrome调试器。重新启动应用程序时,出现以下错误: 如何正常停止我的应用程序以避免此错误? 完整的代码在这里。 问题答案: 似乎VSCode,Puppeteer,nodemon,express等导致了此问题,您在后台运行了一个进程,或者只是关闭了调试区域(

  • 问题内容: 如何调试Node.js服务器应用程序? 现在,我主要使用带有以下打印语句的 警报调试 : 必须有更好的调试方法。我知道GoogleChrome浏览器有一个命令行调试器。该调试器也可用于Node.js吗? 问题答案: 节点检查器可以节省一天!从支持WebSocket的任何浏览器中使用它。断点,事件探查器,实时编码等,这真的很棒。 通过以下方式安装: 然后运行:

  • 问题内容: 例如,如何将其从5858更改为7000? 问题答案: 您可以使用以下选项: 您可以对>> v8的最新节点使用选项 https://nodejs.org/en/docs/inspector/

  • 作者注:很多关于这个错误的问题促使我把这个问题贴出来,以备将来参考。 相关问题: 对节点_ENV=production使用spawn函数 节点。jschild_进程。spawn Enoint错误-仅在supervisord下 产卵节点。js错误 https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-tra