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)
作者注:这个错误的许多问题鼓励我张贴这个问题,以供将来参考。
相关问题:
首先,查看child_process.spawn(命令、参数、选项)的文档:
使用给定的命令
启动新进程,命令行参数在args
中。如果省略,args
默认为空数组。
第三个参数用于指定附加选项,默认为:
{cwd:undefined,env:process.env}
使用env
指定对新进程可见的环境变量,默认值为process.env
。
确保您没有在command
中放入任何命令行参数,并且整个spawn
调用有效。继续下一步。
在源代码上搜索对spawn
或child_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
再次执行此步骤,直到它们不是。在继续下一步之前,必须标识发出错误的侦听器。
有两种可能的情况:
spawn
行为,因此子进程环境将与process.env
相同。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
。
注意:这个错误几乎总是因为命令不存在,因为工作目录不存在,或者是因为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