ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 Node.js 解决“找不到模块”错误?

从 GitHub 拉下一个模块并按照说明构建它后,我尝试使用以下方法将其拉入现有项目:

> npm install ../faye

这似乎可以解决问题:

> npm list
/home/dave/src/server
└─┬ faye@0.7.1
  ├── cookiejar@1.3.0
  ├── hiredis@0.1.13
  └── redis@0.7.1

但是 Node.js 找不到模块:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

我真的很想了解这里发生了什么,但是对于下一步该往哪里看,我有点茫然。有什么建议么?

node_modules 目录应位于项目的根目录中,在您的情况下与 app.js 相同。为什么使用 .. npm 安装路径?
将“npm install ../faye”更改为“npm install ../faye/build”后,它按预期工作。我不知道这是多么典型,但是 faye 在构建时会创建一个构建目录并将 package.json 的副本放在那里。 npm 不会在根级别抱怨 package.json,但它会引用该级别不存在的文件。
我解决了这个问题,但并没有真正解决我的真正问题,即如何解决这个问题。我将尝试提出一些改进 npm 和/或 node 的建议,以使新手更容易避免这种情况。
浏览此Link,您可能会了解它无法查找您的模块的确切位置。
检查天气你在安装它的同一个文件夹中吗?如果您没有全局安装它。

C
Charlie Bamford

使用 npm install 仅将模块安装到当前目录(在名为 node_modules 的子目录中)。 app.js 是否位于 home/dave/src/server/ 下?如果没有并且您想使用任何目录中的模块,则需要使用 npm install -g 全局安装它。

我通常在本地安装大多数包,以便它们与我的项目代码一起签入。

更新(8/2019):

现在你可以使用 package-lock.json 文件,它会在 npm 修改你的 node_modules 目录时自动生成。因此,您可以省略签入包,因为 package-lock.json 会跟踪您当前正在使用的 node_modules 的确切版本。要从 package-lock.json 而不是 package.json 安装软件包,请使用命令 npm ci

更新(3/2016):

我的回复收到了很多批评,特别是我签入了我的代码所依赖的包。几天前,有人取消了他们所有的包 (https://kodfabrik.com/journal/i-ve-just-liberated-my-modules) 的发布,这破坏了 React、Babel 和其他所有东西。希望现在很清楚,如果您有生产代码,则不能依赖 NPM 实际为您维护依赖项。


“我通常在本地安装大多数软件包,以便它们与我的项目代码一起签入。”通常最好创建一个 package.json 列出您所依赖的 npm 模块并忽略 node_modules 文件夹。然后只需 npm install 即可在克隆存储库后进行设置。
除了 package.json 列出依赖项之外,我还喜欢保留我所依赖的事物的已知良好副本。磁盘空间很便宜,如果 npm 或包从 npm 中消失,我的 repo 中仍然有一个完整的工作项目。
作为一名老开发人员,当我阅读 Node 开发人员的“磁盘空间很便宜”的“范式”时,我几乎窒息。我有我正在使用的库。我可能有 100 份(或者更糟,NEAR 份)的想法让我反胃。磁盘空间很便宜,但维护时间很昂贵。如果您正在做一个一次性的玩具项目,那么维护费用可能很便宜。然而,对于实际工作,维护成本很高,并且与磁盘空间成本无关。
我真的不明白这最后的评论。没有人说任何一段代码都有 100 个副本,只是为了拥有你项目所依赖的代码的 1 个副本。如果有一天 NPM 或依赖项消失,另一种选择是拥有一个非功能性项目。我认为从头开始重写依赖项也非常昂贵。顺便说一句,我在 Microsoft 工作了 10 年,我们总是将 3rd 方依赖项检查到我们的源代码树中。
@LloydSargent 拥有“NEAR 副本”并没有更糟,而是更好,因为每个项目都有一个特定的依赖项,你已经定义了这个依赖项,并且你的其余代码都依赖它。如果您在多个项目中有相同的版本,那么如果您更新任何内容,则必须更新所有内容。固定依赖项允许零碎升级 - 大大减少维护。真正的工作,非玩具项目。
P
Peter Mortensen

我有一个非常相似的问题。删除整个 node_modules 文件夹并重新安装对我有用:

rm -rf node_modules
npm install

我也会做一个 npm 缓存清理,只是为了安全:)
每当出现 npm install/npm update 无法解决的奇怪依赖问题时,这可能是一个很好的故障排除第一步。这解决了当我尝试运行我的 Express 应用程序时 Error: Cannot find module 'http-errors' 随机开始显示的问题。
令人惊讶的是,@carelessChoosy 的回答解决了缺少的依赖项。似乎使用 npm install 升级和降级并不能保持整洁。
此处缺少的步骤是在运行 npm install 之前删除您的 package-lock.json 文件。
npm ci 会做同样的事情,但它是 x 平台
b
bruntime
npm install --save module_name

例如,如果错误是:

{ [错误:找不到模块'/root/.npm/form-data'] 代码:'MODULE_NOT_FOUND'}

那么您可以通过执行命令 npm install --save form-data 来解决此问题。


好像当我全局安装它时,npm/node-modules 文件夹是空的,我试图使用 ng new project-name 它显示一些模块丢失......我必须使用给定的命令安装它们。然后它解决了问题,但是否有任何单个命令可以一次安装所有这些?
m
mgthomas99

对于 TypeScript 用户,如果您正在导入内置的 Node 模块(例如 httppathurl)并且遇到错误(例如 "Cannot find module "x"),则可以通过运行来修复错误

npm install @types/node --save-dev

该命令会将 NodeJS TypeScript 定义导入您的项目,允许您使用 Node 的内置模块。


X
Xakiru
rm package-lock.json
rm -r node_modules
npm i

那应该解决问题并安装所有软件包。


很大的帮助,谢谢
P
Peter Mortensen

当第一个 npm 安装由于某种原因(npm 的 SIGINT)崩溃、延迟太长或数据损坏时,就会发生这种情况。再次尝试 npm install 不会解决问题。

首次检查 npm 时出现问题,因此最好的选择是删除文件并重新启动 npm 安装。


这为我诊断了问题。我最终做了 npm cache clear 并清除了 node_modules,然后是 npm install 来解决我的问题。
u
ukosteopath

我昨天遇到了这个错误。我花了一段时间才意识到 package.json 中的 main 条目指向的是我已移动的文件。一旦我更新错误消失并且包工作。


圣牛......出于绝望,我在谷歌中输入了“错误:找不到模块”,并找到了这个问题。你的回答解决了我的问题。我不敢相信这样一个模糊的搜索词找到了正确的答案。向您和 Google 致敬!
非常多这个。我设法将我的子模块的 main 条目指向了一个从其存储库中排除的目录,因此当我尝试通过 npm install 包含它时它起作用了,但是在需要时找不到导出!非常感谢这个明显但有用的答案。
谢谢你。我在使用 Yarn 工作区时遇到了这种情况,所以一直在寻找路径解析算法和各种方法。 :) 我被错误消息“定位”模块的方式所抛出,而且 ESLint 也给出了类似的错误消息。然后我看到你的回答,意识到我是个笨蛋。谢谢!
E
Edgar Chavolla

检查环境变量 NODE_PATH 是否设置正确并指向 node_modules 路径。 nodejs 使用这个变量来搜索库


我对此表示赞成,因为它解决了我的直接问题,并引导我进入 this node.js documentation。但我认为这不是一个笼统的答案,因为文档指出了定位模块的替代策略。
P
Peter Mortensen

如果您使用 nvm,请检查绑定到其他库的现有 node_modules 是否已针对正确的 Node.js 版本进行编译。

我有同样的错误。原因如下:我们使用 nvm 因为我们在服务器上运行两个应用程序,一个需要 Node.js 5.6,因为它使用 node-gd(目前不在 Node.js 6 上运行),另一个需要Node.js 6。Node.js 6 是 apt-get 安装。

我们也使用 pm2 工具来部署。

因此,默认设置是在 nvm 未生效时启动 pm2 进程,因此它使用 Node.js(版本 6)的 apt-get 安装。所以主要的 pm2 守护进程从 Node.js 6 开始。如果我在 fork 模式下运行应用程序,它们会在单独的进程中启动,并且 nvm 设置有效。当我在集群模式下运行应用程序时——它们继承了非 nvm 环境。

因此,当我尝试切换到集群模式时,应用程序无法启动,因为为 5.6 编译的绑定失败并显示此消息。

我已经通过在 nvm 设置生效时重新启动 pm2 来解决这个问题。还应该修复启动脚本。


M
MrCranky

如果您正在require在其 package.json 中包含缺失或不正确的 main 字段的模块,则可能会遇到此错误。尽管模块本身已安装,但 npm/node 必须使用单个 .js 文件作为模块的入口点。如果 main 字段不存在,则默认为在您的模块文件夹中查找 index.js。如果您的模块的主文件不是称为 index.js,它将无法require它。

在将基于 browserify 的模块转换为 CommonJS require 模块时发现; browserify 不关心缺少的 main 字段,因此该错误未被注意到。


j
james ace

如果所有其他方法都不适合您...尝试

npm link package_name

例如

npm link webpack
npm link autoprefixer

ETC


解释将不胜感激!
解释一下,有人!
P
PrashanthiDevi

从您的项目中删除您的 node_module 根文件夹(例如:myApp)。转到 myApp 文件夹,然后从终端键入以下命令

>myApp>npm install

它将安装您项目所需的所有依赖模块。


您能否详细说明您的答案,添加更多关于您提供的解决方案的描述?
D
Dave

专家提示:

这个错误发生在我与疲劳和轻度疾病作斗争时,因为我输入了 node blah 而不是 npm blah

收到的错误信息还不足以提醒我自己的愚蠢!


S
Srishti Singh

指定 restler 文件夹的路径,它将在 node_modules 文件夹中,如: var rest = require('./node_modules/restler');

这对我有用。


m
martinp999

我可以再添加一个地方来检查;我尝试使用的包是我自己发布到私有 NPM 存储库的另一个包。我忘记正确配置 package.json 中的 'main' 属性。因此,该包位于消费包的 node_modules 文件夹中,但我得到“找不到模块”。我花了几分钟才意识到我的错误。 :-(


K
Kartik Garasia

如果您使用 typescript 并在安装所有节点模块后出现错误,请删除 package-lock.json。然后运行 npm install


Y
Yevgeny Simkin

刚刚发现了一个不寻常的场景,它可能对某人有用,有点像红鲱鱼。

我也遇到了无法找到模块错误,但奇怪的是,在我的本地(Mac 托管)Node.js 环境中一切正常。这个问题只有在我们的 Linux 服务器上部署代码时才会出现。

嗯...原来是一个错字,(显然)基于 Mac 的 Node.js 安装非常乐意忽略。

包含看起来像这样:

var S3Uploader = require('./S3Uploader.class');

但实际文件名为“s3Uploader.class.js”

请注意代码和文件名之间“s”与“S”的大小写差异。

所以 - 如果这里的其他解决方案都没有解决您的问题,请三重检查您是否没有错误地将包含的文件名中的字符大小写错误! :)

和杜!


默认情况下 osx 文件系统 (HFS+) 是 case insensitive ...不久前发现的,但它绝对是可配置的
U
Ursu Alexandr

在我的情况下,我有 UNMET PEER DEPENDENCY redux@^3.0.0 导致此错误消息,请查看所有这些并使用 --save 再次安装缺少的模块

npm install redux --save

K
Kal

删除 node/npm 然后重新安装稳定(不是最新的)版本对我有用。

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

https://nodejs.org/en/download/

J
JGFMK

我在使用 live-server 时遇到了这个问题(使用 Fullstack React 书):

我不断得到:

错误:找不到模块 './disable-browser-cache.js' ...

我不得不调整我的 package.json

来自:“脚本”:{ ... “服务器”:“live-server public --host=localhost --port=3000 --middleware=./disable-browser-cache.js” ... } “脚本” : {

收件人:...“服务器”:“live-server public --host=localhost --port=3000 --middleware=../../disable-browser-cache.js”...}

请注意相对路径似乎损坏/尴尬... ./ 变为 ../../

我发现了问题 here

另外,如果有人跟随那本书:

将 packages.json 中的 devDependencies 更改为:

"live-server": "https://github.com/tapio/live-server/tarball/master"

目前从 v1.2.0 升级到 v1.2.1

使用nvm很好。最好安装 Node 的 v13.14(*v14+ 会让人头疼) nvm install v13.14.0 nvm alias default v13.14.0 Update npm with npm i -g npm@7.3.0 run: npm update 你可以使用 npm list 来查看依赖的层次结构也是如此。 (出于某种原因,节点 15 + 最新的 npm 默认只显示第一级深度 - 一个 la package.json。这使得默认命令毫无意义!您可以附加 --depth=n) 以使命令再次更有用)。你也可以使用 npm 审计。存在需要(更新 chokidar 和其他一些软件包)到较新版本的问题。 live-server 尚未更新以支持较新的相应 node v 14 库版本。

查看类似帖子here

脚注:当您到达 JSX 部分时,另一件事,请在此处查看我的答案:https://stackoverflow.com/a/65430910/495157

当您到达:

具有道具、状态和子项的高级组件配置。 P182+,节点版本 13 不支持那里的某些依赖项。

稍后也会为此添加调查结果。


x
xpagesbeast

就我而言,

npm install -D tslib @types/node

解决了我的问题,然后我就可以运行了

ts-node index.ts

成功地。


B
Belgor

我试图发布自己的包,然后将其包含在另一个项目中。由于我如何构建第一个模块,我遇到了这个问题。我使用 ES2015 导出来创建模块,例如,可以说模块看起来像这样:

export default function(who = 'world'){
    return `Hello ${who}`;
}

使用 Babel 编译后发布之前:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

所以在另一个项目中的 npm install module-name 之后(没有 ES2015)我必须做

var hello = require('module-name').default;

实际导入包。

希望有帮助!


C
Chris

webpackwebpack-dev-middleware 一起使用时遇到此问题。

已经把一个文件变成了一个文件夹。

观察者似乎没有看到新文件夹,并且模块现在丢失了。

通过重新启动进程修复。


M
Mohammed Abo-zaid

也许像我一样,您将“视图引擎”设置为不存在的引擎,或者尝试使用未注册的模板引擎。确保您使用: app.engine('engine name',engine) app.set('view engine','engine name')


m
maverick

就我而言,我没有使用正确版本的 nvm。


s
skygate

一个罕见但可能的情况是模块名称中的拼写错误。我在执行 node .\util.js 时错过了文件名中的“s”,它应该是 node.\utils.js,并且在这个问题下的所有答案中没有找到任何解决方案,直到我发现我什至无法运行文件如果我删除所有内容!


D
DerpyNerd

显然,从这个问题来看,有很多可能的原因。

也许这会对某人有所帮助,希望没有人像我一样愚蠢地使用这种技术:

检查文件夹树上是否有任何 node_modules 文件夹。

场景 1:如果您曾经有一个项目文件夹,您在多个项目之间共享一个 node_modules 文件夹,那么您可能没有任何问题

|- projects
| |- node_modules     <- OK
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json

场景 2:如果您添加了第三个不同性质的项目,您可以选择在该项目中保留一个 node_modules 文件夹:

|- projects
| |- node_modules     <- Can be used by project 3
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json
| |- project3
| | |- node_modules   <- Packages for project 3 only
| | |- package.json

我猜项目 3 的 node-modules 文件夹中的一些包依赖于它在父文件夹的 node_modules 文件夹中找到(或未找到)的包。即使您希望在项目 3 的 node_modules 文件夹中找到依赖项。也许是因为某些包的导入和引用方式?

不用说,这是一场等待发生的灾难:)


m
majestzim

我在升级节点版本以及安装几个不同的软件包版本时遇到了这个问题。该项目创建了一个 docker 镜像/容器来工作。

问题是当我添加一个包并重建项目时,没有重新创建 Docker 映像。正确的信息在我的本地 package.json 和 package-lock.json 文件中。

删除 Docker 映像而不仅仅是容器解决了我的问题。


S
Soumya Kanti

当团队中的其他人在 SVN 中更新 package.json 时,我遇到了同样的问题。仅仅删除 node_modules 目录并没有帮助。我如何解决这个问题是:

rm -rf node_modules
rm package.json
rm package-lock.json
svn up
npm install
ng build --env=prod

希望这对某人有帮助!


感谢您的提醒。在我的情况下,它是 package-lock.json 再次搞砸了,但在删除它和 node_modules 然后运行 npm install 之后一切都很好。
如果您删除 package.json,NPM 如何知道要安装什么?
A
Akash Limbani

请安装新的 CLI v3 (npm install -g ionic@latest)。

如果这个问题在 CLI v3 中仍然是一个问题。谢谢!


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅