如何在节点 .js 上调试“错误:生成 ENOENT”?

How do I debug "Error: spawn ENOENT" on node.js?

提问人:laconbass 提问时间:12/29/2014 最后编辑:Communitylaconbass 更新时间:7/21/2023 访问量:735630

问:

当我收到以下错误时:

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)

我可以按照什么程序来修复它?

作者注:此错误的许多问题促使我发布此问题以供将来参考。

相关问题:

节点 .js 调试 错误处理 子进程 生成

评论

16赞 Joshua Pinter 4/2/2020
就我而言,我将整个命令作为字符串传入,而不是将命令作为第一个参数传入,将选项作为第二个参数的数组传入。例如,我正在做而不是 .execspawn( "adb logcat -c" )spawn( "adb", [ "logcat", "-c" ] )
0赞 Ank_247shbm 3/4/2022
这对我有用:stackoverflow.com/a/65008091/8119511
0赞 Manohar Reddy Poreddy 9/17/2022
在 VS Code 中,在 linter 扩展下方卸载,然后它起作用了:marketplace.visualstudio.com/items?itemName=fnando.linter .查看 github.com/yarnpkg/yarn/issues/5275#issuecomment-1250079916
0赞 laconbass 9/18/2022
同样,环境中缺少依赖关系会导致

答:

158赞 laconbass 12/29/2014 #1

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

首先,查看 child_process.spawn( command, args, options )的文档

使用给定的命令行参数启动一个新进程。如果省略,则默认为空 Array。commandargsargs

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

{ cwd: undefined, env: process.env }

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

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

步骤 2:确定发出错误事件的事件发射器

在源代码中搜索每个调用 ,或 ,即spawnchild_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

再次执行此步骤,直到它们没有。 在继续下一步之前,必须确定发出错误的侦听器。

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

有两种可能的情况:

  1. 您依赖于默认行为,因此子进程环境将与 相同。spawnprocess.env
  2. 您正在显式地将对象传递给参数。envspawnoptions

在这两种情况下,都必须检查生成的子进程将使用的环境对象上的 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 错误,因为除非它是可执行文件的绝对路径,否则无法找到任何路径。command

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

第 4 步:确保存在于commandPATH

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

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

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

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

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

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

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

当命令是一个简单的脚本文件时,请确保可以从 PATH 上的目录访问它。如果不是,请将其移动到一个或链接到它。

一旦确定已正确设置并可从中访问,您应该能够在不被抛出的情况下生成子进程。PATHcommandspawn ENOENT

评论

1赞 CodeManiak 7/10/2015
这对我对 Spawn ENOENT 的调试非常有帮助。我已经多次引用了它。谢谢!
48赞 Daniel Imfeld 11/20/2015
我还发现,如果您在选项中指定,则会抛出 ENOENT,但给定的目录不存在。cwd
4赞 GreenAsJade 11/29/2015
@DanielImfeld完全拯救。你应该写一个答案来说明这一点。
4赞 anty 8/11/2016
当您使用本答案中步骤 3 所示的示例并传递自定义环境时,请务必指定 ,例如: 。默认情况下,env 选项不会从当前 env 继承变量。spawn('some-command', ['--help'], { env: env });PATH{ env: { PATH: process.env.PATH } }
14赞 Nickofthyme 1/25/2019
我能够通过传递到生成选项来解决我的问题。shell: true
303赞 Jiaji Zhou 1/11/2015 #2

注意:此错误几乎总是由于命令不存在、工作目录不存在或仅由 Windows 错误引起的。

我发现了一种特别简单的方法来了解以下根本原因:

Error: spawn ENOENT

这个错误的问题是,错误消息中几乎没有信息可以告诉你调用站点在哪里,即找不到哪个可执行文件/命令,特别是当你有一个很大的代码库,有很多生成调用时。另一方面,如果我们知道导致错误的确切命令,那么我们可以按照@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 找不到可执行文件来解决问题的原因。

评论

5赞 Adam Monsen 4/16/2015
这是另一个想法:只需更改并重试即可。 将告诉您它试图运行的命令。spawn()exec()exec()
1赞 Dan Nissenbaum 6/21/2015
重要提示:请确保将上面的代码放置在尽可能靠近主 JS 文件开头的位置。如果先加载其他模块,它们可以隐藏“生成”函数,并且永远不会调用此处的覆盖。
4赞 newguy 11/3/2016
我没有运气使用脚本。它根本不起作用。
0赞 Felix Eve 2/7/2017
那么,您将如何在 grunt 文件中使用此方法呢?我不知道该把它放在哪里。
2赞 Yann Duran 3/3/2017
这对我来说非常有效。我只是把它放在我的 gulpfile.js 文件的顶部,宾果邦戈邦戈,生成日志记录!
11赞 PromInc 6/13/2015 #3

就我而言,由于未安装必要的依赖系统资源,我引发了此错误。

更具体地说,我有一个使用 ImageMagick 的 NodeJS 应用程序。尽管安装了 npm 包,但核心 Linux ImageMagick 尚未安装。我做了一个合适的安装ImageMagick,之后一切都很好!

评论

0赞 Somename 4/4/2017
Windows 是否也需要安装 ImageMagick?我在 Windows 上测试并出现错误
0赞 Gal Bracha 11/24/2020
运行(安装)已修复yarn
0赞 Paul 1/7/2022
只需运行brew install imagemagick
22赞 Alex Turpin 8/6/2015 #4

对于任何可能偶然发现这一点的人,如果所有其他答案都无济于事并且您在 Windows 上,请知道 Windows 上的 spawn 当前存在一个大问题,并且环境变量可能会导致某些调用 spawn 不起作用,具体取决于目标命令的安装方式。PATHEXT

评论

2赞 Nilzor 2/23/2016
解决方案是什么?
6赞 Nilzor 2/23/2016
使用 node-cross-spawn 对我有用。请看下面的答案: stackoverflow.com/a/35561971/507339
2赞 reduckted 8/16/2016
花了很长时间试图找出问题所在,这最终成为问题所在。我放弃了,只是用了。spawnexec
33赞 Nilzor 2/23/2016 #5

Windows 解决方案:替换为 node-cross-spawn。例如,在应用.js的开头:spawn

(function() {
    var childProcess = require("child_process");
    childProcess.spawn = require('cross-spawn');
})(); 

评论

3赞 Bogdan T Stancu 8/19/2016
除了它是临时工外,无需child_process。与节点的 spawn 或 spawnSync 完全相同,因此它是替换的下降。var spawn = require('cross-spawn'); // Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
0赞 MTGradwell 2/28/2016 #6

当我尝试从 Debian Linux 系统上的 VS Code 编辑器中调试 node.js 程序时,我遇到了此错误。我注意到同样的事情在 Windows 上运行正常。之前在这里给出的解决方案没有多大帮助,因为我没有编写任何“生成”命令。违规代码可能是由Microsoft编写的,并隐藏在VS Code程序的引擎盖下。

接下来,我注意到 node.js 在 Windows 上被称为 node,但在 Debian(大概在基于 Debian 的系统,如 Ubuntu)上,它被称为 nodejs。所以我创建了一个别名 - 从根终端,我运行

ln -s /usr/bin/nodejs /usr/local/bin/node

这解决了问题。相同或类似的过程可能适用于其他情况,其中您的 node.js 称为 nodejs,但您正在运行一个期望它称为 node 的程序,反之亦然。

31赞 Alexander Mills 4/12/2016 #7

@laconbass的回答帮助了我,而且可能是最正确的。

我来这里是因为我错误地使用了 spawn。 举个简单的例子:

这是不正确的:

const s = cp.spawn('npm install -D suman', [], {
    cwd: root
});

这是不正确的:

const s = cp.spawn('npm', ['install -D suman'], {
    cwd: root
});

这是正确的:

const s = cp.spawn('npm', ['install','-D','suman'], {
    cwd: root
});

但是,我建议这样做:

const s = cp.spawn('bash');
s.stdin.end(`cd "${root}" && npm install -D suman`);
s.once('exit', code => {
   // exit
});

这是因为只要安装了 Bash,事件就会始终触发,否则,如果我们以第一种方式使用它,如果我们直接启动“npm”,则事件可能会首先触发。cp.on('exit', fn)cp.on('error', fn)

评论

1赞 laconbass 4/21/2016
考虑重构我的答案以提供“一般指南”,并详细描述问题的每个原因(错过依赖项、不正确的调用、错误的环境,...)。
2赞 Alexander Mills 11/21/2017
每个喜欢这个答案的人,可能也对这个原生替代品感兴趣:gist.github.com/ORESoftware/7bf225f0045b4649de6848f1ea5def4c
3赞 givanse 3/1/2019
投了反对票,因为如果你想要的是一个 shell,那么你应该使用或传递给 .child_process.execshell: truespawn
1赞 Alexander Mills 3/1/2019
@givanse不一定是真的 - 你可能想要运行 zsh 或 bash 或 fsh,具体取决于你想使用的 shell,并且行为也不同
-1赞 Chaya Sandamali 5/6/2016 #8

我在 Windows 8 上遇到了同样的错误,问题是因为缺少系统路径的环境变量。将“C:\Windows\System32\”值添加到系统 PATH 变量中。

2赞 Gum Joe 5/22/2016 #9

我遇到了同样的问题,但我找到了一种简单的方法来解决它。 如果用户已将程序添加到PATH中,则似乎是错误的(例如,正常的系统命令有效)。spawn()

要解决此问题,您可以使用 which 模块 ():npm install --save which

// Require which and child_process
const which = require('which');
const spawn = require('child_process').spawn;
// Find npm in PATH
const npm = which.sync('npm');
// Execute
const noErrorSpawn = spawn(npm, ['install']);
45赞 Leeroy Brun 6/17/2016 #10

正如@DanielImfeld所指出的,如果您在选项中指定“cwd”,但给定的目录不存在,则会抛出 ENOENT。

评论

1赞 Mitro 10/3/2017
那么有没有办法在特定目录中执行命令呢?
0赞 Museful 1/16/2019
在 Windows (7) 中,您似乎还需要在路径中包含驱动器号:“c:/...”而不仅仅是“/...”cwd
32赞 Li Zheng 9/25/2016 #11

对于 Windows 上的 ENOENT,https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 修复它。

例如,将 spawn('npm', ['-v'], {stdio: 'inherit'}) 替换为:

  • 对于所有 Node.js 版本:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
    
  • 对于 Node.js 5.x 及更高版本:

    spawn('npm', ['-v'], {stdio: 'inherit', shell: true})
    

评论

2赞 Deilan 6/6/2017
在哪里进行这些修改?
13赞 Ted Nyberg 8/13/2018
关键部分是添加shell: true
1赞 Dalton 12/26/2016 #12

确保要执行的模块已安装,如果它不是节点模块,则为命令的完整路径

2赞 Zack 6/3/2017 #13

使用而不是生成来获取更具体的错误消息!require('child_process').exec

例如:

var exec = require('child_process').exec;
var commandStr = 'java -jar something.jar';

exec(commandStr, function(error, stdout, stderr) {
  if(error || stderr) console.log(error || stderr);
  else console.log(stdout);
});
0赞 Joel B 6/18/2017 #14

如果您使用的是 Windows Node,.js 在处理引号时会做一些有趣的工作,这可能会导致您发出一个您知道在控制台中有效的命令,但在 Node 中运行时不起作用。例如,以下操作应有效:

spawn('ping', ['"8.8.8.8"'], {});

但失败了。有一个非常未记录的选项来处理引号/类似的东西,似乎可以解决问题,只要确保将以下内容添加到您的 opts 对象中:windowsVerbatimArguments

const opts = {
    windowsVerbatimArguments: true
};

你的命令应该重新开始工作。

 spawn('ping', ['"8.8.8.8"'], { windowsVerbatimArguments: true });

评论

0赞 laconbass 6/29/2017
不要在数组内引用参数
0赞 Joel B 7/1/2017
@laconbass 这是一个显然微不足道的例子来传达这个概念,因此可以删除引号。但是,在某些情况下,您绝对需要引用参数(例如,如果您需要传递一个参数,该参数的路径中有一个空格:“C:\Program Files\...”)。我在这里发布它是因为,即使它可能不是您的特定错误情况的原因,它也希望能帮助其他人遇到这个神秘的错误,因为 Node 在 Windows 上处理引号就像我遇到的那样。
0赞 laconbass 7/5/2017
node.js 已经制作了一些黑魔法,并默默地“正确”引用参数。您的示例应该在没有您提到的未记录选项的情况下工作,方法是取消数组内的参数。
0赞 Troncoso 11/16/2018
只是为了添加我自己的经验,我从节点运行一个 java 进程。这个错误发生在我身上是因为命令周围的引号,而不是参数。在命令路径中使用空格进行测试,它仍然可以在不带引号的情况下工作
1赞 Rajkumar Bansal 3/13/2018 #15

我在运行测试用例时也遇到了这个烦人的问题,所以我尝试了很多方法来解决这个问题。但是对我来说有效的方法是从包含主文件的目录运行测试运行程序,其中包括您的nodejs spawn函数,如下所示:

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

例如,此文件名是 test.js,因此只需移动到包含它的文件夹即可。就我而言,它是这样的测试文件夹:

cd root/test/

然后从运行你的测试运行器,在我的情况下是摩卡,所以它会是这样的:

mocha test.js

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

1赞 Dan Alboteanu 11/10/2018 #16

我的解决方案

var spawn = require('child_process').spawn;

const isWindows = /^win/.test(process.platform); 

spawn(isWindows ? 'twitter-proxy.cmd' : 'twitter-proxy');
spawn(isWindows ? 'http-server.cmd' : 'http-server');

评论

1赞 laconbass 1/30/2019
虽然这可能是 win 特定修复的解决方案,但我看不出它如何帮助调试 ENOENT 的真正原因
1赞 Mathieu CAROFF 5/29/2019
我不知道为什么,但是 spawn 调用可以在没有 的节点 repl 中工作,但在打字稿 jest 测试中失败。-- 这个错误可能很难弄清楚,这个答案值得更多的赞成。.cmd
0赞 laconbass 10/8/2020
扩展问题已经被现有的答案所涵盖.cmd
1赞 MostlyArmless 8/10/2019 #17

我在 Windows 上遇到了这个问题,其中调用并使用完全相同的命令(省略参数)工作正常(所以我知道我的命令已打开),但会给 ENOENT。原来,我只需要附加到我正在使用的命令中:execspawnexec$PATHspawn.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']);
6赞 Rico Kahler 9/25/2019 #18

您是否正在更改选项?env

然后看看这个答案。


我试图生成一个节点进程和 TIL,您应该在生成时传播现有的环境变量,否则您将丢失环境变量,并可能丢失其他重要变量。PATH

这是我的解决方法:

const nodeProcess = spawn('node', ['--help'], {
  env: {
    // by default, spawn uses `process.env` for the value of `env`
    // you can _add_ to this behavior, by spreading `process.env`
    ...process.env,
    OTHER_ENV_VARIABLE: 'test',
  }
});
5赞 Kalle Richter 10/21/2019 #19

如果您在无法修改其源代码的应用程序中遇到此问题,请考虑使用环境变量设置为 来调用它,例如 。这将为您提供在哪个目录中调用了哪些命令行的信息,通常最后一个详细信息是失败的原因。NODE_DEBUGchild_processNODE_DEBUG=child_process yarn test

评论

0赞 laconbass 6/24/2020
您知道能够使用此技术的最小节点 --version 吗?
0赞 Kalle Richter 6/24/2020
@laconbass 没有。我认为这是一个很好的 SO 问题,将在几个小时内得到解决。
1赞 laconbass 6/24/2020
只是好奇。它比我检查过的答案更好、更干净
97赞 TechDogLover OR kiaNasirzadeh 1/21/2020 #20

只需添加选项即可解决我的问题:shell: true

以下代码在 Windows 上是错误的:

const { spawn } = require('child_process');
const child = spawn('dir');

解决方法:

const { spawn } = require('child_process');
const child = spawn('dir', [], {shell: true});

基于 Node.js 文档(感谢@Boris评论):

请注意:

如果启用了 shell 选项,请不要将未经清理的用户输入传递给 这个函数。可以使用任何包含 shell 元字符的输入 触发任意命令执行。

评论

6赞 bFunc 8/30/2020
谢谢!这解决了我的问题,无需定义cmd或路径
0赞 Topher Fangio 3/17/2022
添加也适用于 MacOS。{ shell: true }
3赞 3/11/2023
请注意,“如果启用了 shell 选项,请不要将未经清理的用户输入传递给此函数。任何包含 shell 元字符的输入都可用于触发任意命令执行。
1赞 pesho hristov 3/31/2023
这就是解决我的问题的方法,在 Windows 上,它找不到......非常感谢:)eslint
1赞 laconbass 7/5/2023
请注意,这是仅限 Windows 的怪癖。ENOENT可能会在其他情况下被抛出
11赞 InsOp 2/14/2020 #21

在任何人花费大量时间调试此问题之前,大多数时候可以通过删除并重新安装软件包来解决。node_modules

要安装:

如果存在锁定文件,则可以使用

yarn install --frozen-lockfile

npm ci

恭敬地。如果不是,那么

yarn install

npm i

评论

0赞 korum 4/1/2020
哇,这么简单的解决方案,它对我有用!每个人都应该先尝试一下,看看它是否能解决问题。
0赞 Steve 5/3/2020 #22

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

评论

1赞 laconbass 5/6/2020
同样,相关以某种方式做文件系统路径。如果没有管理员权限,扩展可能无法访问路径
24赞 2 revslaconbass #23

如何研究引发错误的生成调用:

已知的常见病因

  1. 环境问题

    • 系统中不存在命令可执行文件(未安装依赖项)。查看 Prominc 的回答
    • 命令可执行文件在环境变量指定的目录中不存在。PATH
    • 可执行二进制文件是使用不兼容的库编译的。查看 Danilo-Ramirez 回答
  2. 仅限 Windows 的错误/怪癖

  3. 错误的用法spawn('command', ['--argument', 'list'], { cwd, env, ...opts })

    • 指定的工作目录 () 不存在 ·查看 Leeroy-Brun的回答opts.cwd
    • 命令 spawn('command --wrong --argument list') 中的参数列表String
    • 命令字符串中的 Env vars spawn('ENV_VAR=WRONG command')
    • 参数列表指定为 spawn('cmd', '--argument list')ArrayString
    • 取消设置环境变量 spawn('cmd', [], { env: { variable } }PATH => spawn('cmd', [], { env: { ...process.env, variable } }

有 2 个可能的起源:ENOENT

  1. 您正在编写的代码
  2. 您依赖的代码

当 origin 是您依赖的代码时,通常原因是环境问题(或 Windows 怪癖)


评论

1赞 Marcello DeSales 9/29/2020
我使用“ab”命令执行execa,但是容器中没有安装“Apache Bench”......所以,第一个“环境问题”案例......
0赞 SkorpEN 8/6/2020 #24

在我的情况下删除节点,删除所有 AppData/Roaming/npm 和 AppData/Roaming/npm-cache 并再次安装节点解决了这个问题。

0赞 Chathurika Sandarenu 3/25/2021 #25

最近我也遇到了类似的问题。

Starting the development server...

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

Error: spawn null ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
Emitted 'error' event at:
    at Process.ChildProcess._handle.onexit (internal/child_process.js:246:12)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
error Command failed with exit code 1.

这是由于 .我有,但它必须是.更改该配置解决了我的问题。.envBROWSERBROWSER=nullBROWSER=none

0赞 Sunil Jakhar 5/7/2021 #26

尝试了所有没有任何效果,我的系统有不同的问题。

对我来说,工作解决方案是运行命令: npm config set script-shell “C:\Program Files\git\bin\bash.exe”

评论

0赞 laconbass 5/7/2021
您的问题似乎与自身有关,而不是与节点的 .这似乎是一个 Windows 怪癖npmchild_process.spawn()
2赞 Danilo Ramirez 12/28/2021 #27

我发现的一个案例不在此列表中,但值得添加:

在 Alpine Linux 上,如果可执行文件不兼容,则 Node 将出现 ENOENT 错误。

Alpine 期望 .可执行文件(例如 作为 chromium 的一部分),作为系统调用的包装器进行编译,当被 调用时,ENOENT 将失败。libcchromeglibcspawn

评论

0赞 Junaid Atique 9/16/2022
是的,这就是问题所在。为了解决这个问题,请遵循以下 github.com/facebook/flow/issues/3649#issuecomment-447115855
-1赞 Paul 1/7/2022 #28

模拟器上的本地开发

请确保在本地安装包。通过更改命令,我得到了一个更详细的错误,并发现我没有安装该软件包。只需运行,检查包是否存在:spawnexec

brew install imagemagick

1赞 treckstar 1/29/2023 #29

我在构建时出现了这个。gulp-jekyllPowershellWindows 11

nodejs 10 LTS, , , ,gulp v3.9.1ruby 3.1bundler 2.4.5jekyll 4.2.2

这里的这行代码是我遇到 和 的问题的原因。ENOENTspawnbundle

  return cp.spawn('bundle', [
    'exec', 
    'jekyll', 
    'build', 
    '--source=app', '--destination=build/development', '--config=_config.yml', '--profile'
  ], { stdio: 'inherit' })
  .on('close', done);

返回了两个错误,故障排除应从此处开始。🤓🧐

events.js:174
      throw er; // Unhandled 'error' event
      ^
Error: spawn bundle ENOENT

没有处理错误事件,因此使用简单的处理将暴露带有调试信息的真正错误:cp.spawnconsole.log()

  return cp.spawn('bundle', [
    'exec', 
    'jekyll', 
    'build', 
    '--source=app', '--destination=build/development', '--config=_config.yml', '--profile'
  ], { stdio: 'inherit' })
  .on('error', (e) => console.log(e))
  .on('close', done);

现在,这提供了更多可供调试的信息。

{ Error: spawn bundle ENOENT
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn bundle',
  path: 'bundle',
  spawnargs:
   [ 'exec',
     'jekyll',
     'build',
     '--source=app',
     '--destination=build/development',
     '--config=_config.yml',
     '--profile' ] }

下一步调试是使用 child_process.spawn(command[, args][, options]) 的文档。如上所述,将 添加到生成选项中是一个可行的解决方案。这也解决了我的问题。😌nodejs 10 LTS{ shell: true }

  { stdio: 'inherit', shell: true }

这个解决方案只是一个创可贴,可以重构以处理所有环境,但这超出了如何排除和调试错误的范围。spawn ENOENTnodejs

-1赞 Harshit Pant 2/17/2023 #30

可能存在以下情况:您的项目目录中有两个package-lock.json文件(在主文件夹中/在主文件夹中),只需删除意外创建的文件即可。删除生成文件夹,然后再次运行服务器。

评论

0赞 laconbass 2/18/2023
这并不能回答这个问题
0赞 Harshit Pant 2/25/2023
它将为大多数面临此问题的人解决问题。