当我得到以下错误:
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)
我该采取什么程序来修理呢?
作者注:这个错误的许多问题鼓励我发布这个问题,以供将来参考。
相关问题:
using spawn function with NODE_ENV=production
node.js child_process.spawn ENOENT error - only under supervisord
spawn ENOENT node.js error
https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
Node JS - child_process spawn('npm install') in Grunt task results in ENOENT error
Running "foreman" task Fatal error: spawn ENOENT
unhandled error event in node js Error: spawn ENOENT at errnoException (child_process.js:975:11)
Node.js SpookyJS: error executing hello.js
https://stackoverflow.com/questions/26572214/run-grunt-on-a-directory-nodewebkit
Run exe file with Child Process NodeJS
Node: child_process.spawn not working on Java even though it's in the path (ENOENT)
spawn ENOENT error with NodeJS (PYTHON related)
image resizing is not working in node.js (partial.js) (non-installed dependency)
npm install error ENOENT (build dependency problem)
Cannot install node.js - oracle module on Windows 7 (build dependency problem)
Error installing gulp using nodejs on windows (strange case)
在运行测试用例时,我也遇到了这个恼人的问题,所以我尝试了许多方法来解决它。但对我来说,有效的方法是在包含主文件的目录中运行你的测试运行器,其中包含你的nodejs衍生函数,如下所示:
nodeProcess = spawn('node',params, {cwd: '../../node/', detached: true });
例如,这个文件名是test.js,所以只需移动到包含它的文件夹。在我的例子中,它是这样的测试文件夹:
cd root/test/
然后从运行您的测试运行程序,在我的情况下,它是摩卡,所以它将是这样的:
mocha test.js
我浪费了一天多的时间来弄清楚。享受! !
我在Windows上遇到了这个问题,用完全相同的命令(省略参数)调用exec和spawn对于exec来说工作得很好(所以我知道我的命令在$PATH上),但spawn会给出ENOENT。原来我只需要将.exe附加到我正在使用的命令:
import { exec, spawn } from 'child_process';
// This works fine
exec('p4 changes -s submitted');
// This gives the ENOENT error
spawn('p4');
// But this resolves it
spawn('p4.exe');
// Even works with the arguments now
spawn('p4.exe', ['changes', '-s', 'submitted']);
如果你在Windows上,Node.js在处理引号时做了一些有趣的事情,可能会导致你发出一个命令,你知道从控制台工作,但不是在Node中运行。例如,以下应该工作:
spawn('ping', ['"8.8.8.8"'], {});
但失败。有一个神奇的无文档选项windowsVerbatimArguments用于处理引号/类似的东西,似乎可以做到这一点,只要确保在你的opts对象中添加以下内容:
const opts = {
windowsVerbatimArguments: true
};
你的指挥部应该能恢复正常工作了。
spawn('ping', ['"8.8.8.8"'], { windowsVerbatimArguments: true });
注意:此错误几乎总是由于命令不存在、工作目录不存在或由windows特有的错误引起的。
我发现了一个特别简单的方法来了解问题的根本原因:
Error: spawn ENOENT
这个错误的问题是,在错误消息中很少有信息告诉你调用的位置,即没有找到哪个可执行/命令,特别是当你有一个很大的代码库,其中有很多衍生调用时。另一方面,如果我们知道导致错误的确切命令,那么我们可以根据@laconbass的回答来解决问题。
我发现了一种非常简单的方法来发现导致问题的命令,而不是像@laconbass的回答中建议的那样在代码中到处添加事件侦听器。关键思想是用一个包装器包装原始的衍生调用,该包装器打印发送给衍生调用的参数。
这是包装器函数,把它放在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不能找到可执行文件来解决这个问题。
对于Windows上的ENOENT, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505修复它。
如更换产卵(npm, [' v '], {stdio:“继承”}):
对于所有node.js版本:
产卵(/ ^赢/ test (process.platform) ?npm。Cmd ': 'npm', ['-v'], {stdio: 'inherit'})
对于node.js 5。X及以后:
产卵(npm, [' v '], {stdio:“继承”,外壳:真})