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)
作者注:很多关于这个错误的问题促使我把这个问题贴出来,以备将来参考。
相关问题:
正如@DanielImfeld所指出的,如果您在选项中指定“cwd”,但给定的目录不存在,则将抛出enoint。
首先,检查子流程的文档。繁殖(命令、参数、选项):
使用给定的命令启动新进程,命令行参数位于
args
。如果省略,args
默认为空数组。
第三个参数用于指定其他选项,默认为:
{cwd:未定义,env:process.env}
使用
env
指定新进程可见的环境变量,默认为process.env
。
确保没有在
command
中放置任何命令行参数,并且整个spawn
调用有效。继续下一步。
搜索每个调用
spawn
或child_process.spawn
的源代码,即:
spawn('some-command', [ '--help' ]);
并为“错误”事件附加一个事件侦听器,这样你就会注意到将其抛出为“未处理”的确切事件发射器。调试后,可以删除该处理程序。
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
执行,您应该获得注册“错误”侦听器的文件路径和行号。比如:
/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
行为,因此子进程环境将与进程相同。环境
您在options
参数中将env
对象明确地传递给spawn
在这两种情况下,必须检查生成的子进程将使用的环境对象上的
路径
键。
场景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
(即,它是未定义的
),将导致spawn
发出ENOENT
错误,因为除非它是绝对路径,否则无法找到任何命令
到可执行文件。
当
PATH
设置正确时,进行下一步。它应该是一个目录,或者目录列表。最后一种情况是正常的。
如果文件名
命令
(即“某些命令”)在路径上定义的至少一个目录中不存在,则Spawn可能会发出
enoint
错误。
找到
命令的确切位置
。在大多数linux发行版上,这可以通过终端使用which
命令来完成。它将告诉您可执行文件的绝对路径(如上所述),或者告诉您是否找不到该文件。
找到命令时的用法及其输出示例
> which some-command
some-command is /usr/bin/some-command
未找到命令时的用法及其输出示例
> which some-command
bash: type: some-command: not found
未安装的程序是找不到命令的最常见原因。如果需要,请参考每个命令留档并安装它。
当命令是一个简单的脚本文件时,确保它可以从
PATH
上的目录访问。如果不是,要么把它移到一个,要么链接到它。
一旦确定正确设置了
路径
,并且可以从中访问命令
,您就应该能够生成子进程,而不必抛出spawn enoint
。
注意:此错误几乎总是由命令不存在、工作目录不存在或仅限windows的错误引起的。
我找到了一种特别简单的方法来了解以下问题的根本原因:
Error: spawn ENOENT
此错误的问题是,错误消息中几乎没有信息可以告诉您调用站点的位置,即找不到哪个可执行文件/命令,尤其是当您有大量生成调用的大型代码库时。另一方面,如果我们知道导致错误的确切命令,那么我们可以按照@laconbass的答案来解决问题。
我找到了一种非常简单的方法来找出哪个命令导致了问题,而不是像@laconbass的回答中所建议的那样在代码中到处添加事件侦听器。关键思想是用一个包装器包装原始的spawn调用,该包装器打印发送给spawn调用的参数。
这是包装器函数,将其放在索引的顶部。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
我有一个JS应用程序。它在linux上运行良好,但在Windows10中我遇到了一个错误。 不正确的代码是 我在github中找到了这个错误的原因,我想问题是spawn nodejs spawn Doc在windows中无法正常工作。但我不知道如何修改这段代码使其工作。有人能帮我吗?
问题内容: 我正在尝试使用命令启动我的角度应用程序,但出现致命错误:生成cmd ENOENT。 我使用以下命令生成我的Angular App 然后我使用命令来启动我的应用 但它不起作用。 系统信息:操作系统:Windows 7 64 bit npm版本:2.11.3 请帮助我,我阅读了所有有关文档,但没有任何线索。 问题答案: 请尝试以下可能的解决方案: 验证npm文件夹是否存在于以下位置C:\
作者注:这个错误的许多问题鼓励我张贴这个问题,以供将来参考。 相关问题: 使用node_env=production的spawn函数 node.js child_process.spawn ENOENT error-仅在supervisord 生成ENOENT Node.js错误 https://stackoverflow.com/questions/27603713/nodejs-spawn-e
问题内容: 我试图让到效果的,然后(在Windows 7; ñ 。一个透明安装了Cygwin所有X命令礼貌 ñ x的命令决心在命令行就好了)。 最初,我使用,但是想捕获stdout / stderr信息,所以我想使用,然后重写代码以使用它。但是,这破坏了一切。 重写的命令变为: 但是,运行此命令将产生以下错误: 重写的命令变为: 但是,运行此命令将产生以下错误: 如何使spawn运行可以正常使用的
我正在尝试使用cmd中的以下命令安装Yeoman: 我得到以下信息: 安装了以下内容: Node.jsv4.4.4 npm v2.15.1,v3.9.0(我尝试了两个版本,我有完全相同的输出消息) 我的电脑在Windows7 x64上运行。 我尝试过的解决方案: > 我跑 npm缓存清除 但是没有运气。 我还尝试了以下方法: > 已删除C:\\AppData\Roaming\npm缓存文件夹 在此