当我得到以下错误:

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)


当前回答

虽然对某些人来说这可能是一个环境路径或其他问题,但我刚刚在Windows 10上为Visual Studio Code安装了Latex Workshop扩展,并在尝试构建/预览PDF时看到了这个错误。作为管理员运行VS Code为我解决了这个问题。

其他回答

对于任何可能偶然发现这一点的人来说,如果所有其他答案都没有帮助,并且你是在Windows上,知道当前Windows上的spawn和patheext环境变量有一个大问题,可以导致某些调用spawn不能工作,这取决于目标命令的安装方式。

我在windows 8上得到了同样的错误。问题是由于系统路径的环境变量丢失。将“C:\Windows\System32\”值添加到系统PATH变量中。

步骤1:确保以正确的方式调用spawn

首先,查看child_process的文档。衍生(命令,参数,选项):

使用给定的命令启动一个新进程,并使用args中的命令行参数。如果省略,args默认为空数组。 第三个参数用于指定额外的选项,默认为: {cwd:未定义,env:进程。env} 使用env指定新进程可见的环境变量,默认为process.env。

确保您没有在命令中放入任何命令行参数,并且整个衍生调用都是有效的。执行下一步。

步骤2:识别发出错误事件的事件发射器

在源代码中搜索每个spawn或child_process调用。产卵。

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

并为'error'事件附加一个事件监听器,这样你就会注意到确切的事件发射器将它作为'Unhandled'抛出。调试之后,可以删除该处理程序。

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

执行后,您将获得注册'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

重复这一步,直到它们消失。在进行下一步之前,必须确定发出错误的侦听器。

步骤3:确保设置了环境变量$PATH

有两种可能的情况:

您依赖于默认的衍生行为,因此子进程环境将与process.env相同。 你是显式地传递一个env对象到options参数上产卵。

在这两种场景中,都必须检查生成的子进程将使用的环境对象上的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的缺失(即,它是未定义的)将导致spawn发出ENOENT错误,因为它不可能定位任何命令,除非它是可执行文件的绝对路径。

当PATH设置正确后,执行下一步。它应该是一个目录或目录列表。最后一种情况很常见。

步骤4:确保命令存在于PATH中定义的目录中

如果filename命令(即'some-command')在PATH上定义的至少一个目录中不存在,Spawn可能会发出ENOENT错误。

找到命令的确切位置。在大多数linux发行版上,这可以在终端上使用which命令完成。它会告诉你可执行文件的绝对路径(如上所述),或者告诉你是否没有找到它。

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

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

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

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

未安装的程序是导致找不到命令的最常见原因。如果需要,请参考每个命令文档并安装它。

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

一旦你确定PATH被正确设置并且命令可以从它访问,你应该能够在不抛出spawn ENOENT的情况下生成你的子进程。

在运行测试用例时,我也遇到了这个恼人的问题,所以我尝试了许多方法来解决它。但对我来说,有效的方法是在包含主文件的目录中运行你的测试运行器,其中包含你的nodejs衍生函数,如下所示:

nodeProcess = spawn('node',params, {cwd: '../../node/', detached: true });

例如,这个文件名是test.js,所以只需移动到包含它的文件夹。在我的例子中,它是这样的测试文件夹:

cd root/test/

然后从运行您的测试运行程序,在我的情况下,它是摩卡,所以它将是这样的:

mocha test.js

我浪费了一天多的时间来弄清楚。享受! !

虽然对某些人来说这可能是一个环境路径或其他问题,但我刚刚在Windows 10上为Visual Studio Code安装了Latex Workshop扩展,并在尝试构建/预览PDF时看到了这个错误。作为管理员运行VS Code为我解决了这个问题。