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

Posted

技术标签:

【中文标题】如何使用 Node.js 解决“找不到模块”错误?【英文标题】:How do I resolve "Cannot find module" error using Node.js? 【发布时间】:2012-02-19 20:58:55 【问题描述】:

从 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/bu​​ild”后,它按预期工作。我不知道这是多么典型,但是 faye 在构建时会创建一个构建目录并将 package.json 的副本放在那里。 npm 不会在根级别抱怨 package.json,但它会引用该级别不存在的文件。 我解决了这个问题,但并没有真正解决我的真正问题,即如何解决这个问题。我会尝试提出一些改进 npm 和/或 node 的建议,让新手更容易避免这种情况。 浏览这个Link,你可能会知道它到底在哪里找不到你的模块.. 检查天气您是否在安装它的同一文件夹中?如果你没有全局安装。 【参考方案1】:

使用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 年,我们总是将第 3 方依赖项检查到我们的源代码树中。 @LloydSargent 拥有“NEAR 副本”没有更糟,它更好,因为每个项目都有一个特定的依赖关系,你已经定义了,而您的其余代码依赖于。如果您在多个项目中拥有相同的 版本,那么如果您更新anything,那么您必须 更新everything。固定依赖项允许零碎升级 - 基本上 less 维护。真正的工作,非玩具项目。【参考方案2】:

我有一个非常相似的问题。删除整个 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 文件。 这对我不起作用,甚至重新启动了计算机;)【参考方案3】:
npm install --save module_name

例如,如果错误是:

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

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

【讨论】:

当我全局安装它时,npm/node-modules 文件夹似乎是空的,我试图使用ng new project-name 它显示一些模块丢失......我必须使用它们来安装它们给定的命令。然后它解决了这个问题,但是有没有一个命令可以一次安装所有这些? 谢谢!当尝试运行 react 项目时找不到 node-sass-chokidar 时,此解决方案对我有用。【参考方案4】:

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

npm install @types/node --save-dev

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

【讨论】:

【参考方案5】:

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

第一次检查 npm 时出错了,所以最好的选择是删除文件并重新启动 npm install。

【讨论】:

这为我诊断出了问题。我最终做了npm cache clear 并清除了node_modules,然后清除了npm install 来解决我的问题。【参考方案6】:

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

【讨论】:

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

如果您使用 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 来解决此问题。还应修复启动脚本。

【讨论】:

【参考方案8】:

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

【讨论】:

我对此表示赞同,因为它解决了我眼前的问题,并把我带到了this node.js documentation。但我认为这不是一个笼统的答案,因为文档指出了定位模块的替代策略。【参考方案9】:
rm package-lock.json
rm -r node_modules
npm i

这应该可以解决问题并安装所有软件包。

【讨论】:

这适用于带有 laravel 8 的 windows 10。【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

npm link package_name

例如

npm link webpack
npm link autoprefixer

e.t.c

【讨论】:

我们将不胜感激! 解释一下,有人!【参考方案12】:

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

>myApp>npm install

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

【讨论】:

能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?【参考方案13】:

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

这对我有用。

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

专业提示:

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

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

【讨论】:

【参考方案17】:

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

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

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

包含看起来像这样:

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

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

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

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

还有啊!

【讨论】:

默认 osx 文件系统 (HFS+) 是 case insensitive ... 不久前发现的,虽然它绝对是可配置的【参考方案18】:

我试图发布我自己的包,然后将其包含在另一个项目中。由于我如何构建第一个模块,我遇到了这个问题。我使用 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;

真正导入包。

希望有帮助!

【讨论】:

【参考方案19】:

当团队中的其他人在 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 怎么知道要安装什么?【参考方案20】:

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

npm install redux --save

【讨论】:

【参考方案21】:

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

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

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

【讨论】:

【参考方案22】:

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

我不断得到:

Error: Cannot find module './disable-browser-cache.js' 
...

我不得不调整我的 package.json

发件人:

“脚本”: ... "server": "live-server public --host=localhost --port=3000 --middleware=./disable-browser-cache.js" ... “脚本”:

收件人:

... "server": "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就好了。 最好安装 v13.14 的 Node(*v14+ 会让人头疼) nvm install v13.14.0 nvm alias default v13.14.0 使用npm i -g npm@7.3.0 更新 npm 运行:npm update 您也可以使用npm list 查看依赖关系的层次结构。 (出于某种原因,节点 15 + 最新的 npm 默认只显示第一级深度 - 就像 package.json。这使得默认命令毫无意义!您可以附加 --depth=n) 以使命令再次更有用)。 您也可以使用npm audit。存在需要(更新chokidar 和其他一些软件包)到较新版本的问题。 live-server 尚未更新以支持较新的相应节点 v 14 库版本。

查看类似帖子here


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

当你到达:

具有道具、状态和子项的高级组件配置。 P182+,节点版本 13 不支持那里的某些依赖项。 稍后也会为此添加调查结果。

【讨论】:

【参考方案23】:

在使用 webpackwebpack-dev-middleware 时遇到了这个问题。

已将单个文件转为文件夹

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

通过重启进程修复。

【讨论】:

【参考方案24】:

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

【讨论】:

【参考方案25】:

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

如果此问题在 CLI v3 中仍然存在。谢谢!

【讨论】:

【参考方案26】:

就我而言,

npm install -D tslib @types/node

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

ts-node index.ts

成功了。

【讨论】:

【参考方案27】:

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

【讨论】:

【参考方案28】:

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

【讨论】:

【参考方案29】:

首先,是的,我的部分回答肯定有助于解决 OP 发布的 错误。其次,在尝试了以下步骤后,我遇到了其他一些错误,因此也编写了这些错误的解决方案。

(嘘!我不确定我是否成功帮助解决了上述错误,或者我是否违反了某些规则或回答格式,但我遇到了上述错误和其他一些错误我花了很多时间来为这些错误找到合适的解决方案。我正在编写完整的解决方案,因为以防万一,如果其他人也面临这些错误,那么他希望在这里得到解决方案。)

所以补充并详细说明PrashanthiDevi提供的答案,并添加我的个人经验,这里是:

我是整个 e2e 和单元测试部分的新手。我从Protractor 开始研究这部分内容。现在我已经有了编写测试的文件,但我必须运行测试。

我已经安装了所有必需的软件和工具,但是当我最初运行代码以运行测试时,gulp itest,我得到了这个'找不到模块'错误。在解决了许多关于 SO 的不同问题后,我找到了一个我认为可以帮助获得解决方案的答案。

此人建议在我的项目文件夹中运行命令npm install

这样做的原因是更新我们项目文件夹内的 node-modules 文件夹,其中包含所有必需和必要的文件和依赖关系。

(以下部分可能与此问题无关,但如果有人遇到与我相同的情况,可能会有所帮助。)

上述步骤确实解决了我之前的错误,但又抛出了一个新错误!这次错误是 Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'

但是,这个错误的解决方案对我来说非常愚蠢(而且很有趣)。我的 selenium 文件夹中已经有了 chromedriver 文件。但是,事实证明上述错误即将到来,因为我的 chromedriver 文件在 selenium 文件夹中,而 不在 文件夹中 strong>chromedriver 文件夹。所以,创建一个 chromedriver 文件夹并在那里复制 chromedriver 文件解决了我的问题!

另外,对于 error: Timed out waiting for the WebDriver Server,您可以将此 代码行 添加到 conf.js 文件在exports.config:

seleniumAddress: 'http://localhost:8080/'

希望这会有所帮助!

【讨论】:

【参考方案30】:

更改目录并指向您当前的项目文件夹,然后“npm install”。 .

这会将所有依赖项和模块安装到您的项目文件夹中。

【讨论】:

以上是关于如何使用 Node.js 解决“找不到模块”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 错误:找不到模块快递

node.js,错误:找不到模块'express'

找不到模块“mysql”node.js

Node.js AWS 部署错误:找不到模块

node.js 错误:找不到模块“lodash.assign”

Node.js 0.8.15 npm 错误:找不到模块 'proto-list'