当前位置: 首页 > 知识库问答 >
问题:

如何调试"错误:生成ENOENT"node.js?

柴俊捷
2023-03-14
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)

作者注:很多关于这个错误的问题促使我把这个问题贴出来,以备将来参考。

相关问题:

  • 对节点_ENV=production使用spawn函数
  • 节点。jschild_进程。spawn Enoint错误-仅在supervisord下
  • 产卵节点。js错误
  • https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
  • Grunt任务中的节点JS-子进程spawn('npm install')导致enoint错误
  • 正在运行“foreman”任务致命错误:spawn enoint
  • 节点js中未处理的错误事件error:spawn enoint at errnoException(child_process.js:975:11)
  • 节点。js SpookyJS:执行hello时出错。js
  • https://stackoverflow.com/questions/26572214/run-grunt-on-a-directory-nodewebkit
  • 使用子进程NodeJS运行exe文件
  • 节点:子进程。spawn不在Java上工作,即使它位于路径(eNont)
  • NodeJS产生enoint错误(与PYTHON相关)
  • 图像大小调整在节点中不起作用。js(partial.js)(非安装依赖项)
  • npm安装错误enoint(生成依赖项问题)
  • 无法安装节点。Windows 7上的js-oracle模块(生成依赖项问题)
  • 在windows上使用nodejs安装gulp时出错(奇怪的情况)

共有3个答案

谭吉星
2023-03-14

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

束俊英
2023-03-14

首先,检查子流程的文档。繁殖(命令、参数、选项):

使用给定的命令启动新进程,命令行参数位于args。如果省略,args默认为空数组。

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

{cwd:未定义,env:process.env}

使用env指定新进程可见的环境变量,默认为process.env

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

搜索每个调用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

再做这一步,直到他们不是。在进行下一步之前,必须确定发出错误的侦听器。

有两种可能的情况:

  1. 您依赖默认的spawn行为,因此子进程环境将与进程相同。环境
  2. 您在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

欧阳骏俊
2023-03-14

注意:此错误几乎总是由命令不存在、工作目录不存在或仅限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缓存文件夹 在此