如何使用Node.js解决"无法找到模块"错误?

Dav*_*sey 559 node.js

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

> npm install ../faye
Run Code Online (Sandbox Code Playgroud)

这似乎可以解决问题:

> npm list
/home/dave/src/server
??? faye@0.7.1
  ??? cookiejar@1.3.0
  ??? hiredis@0.1.13
  ??? redis@0.7.1
Run Code Online (Sandbox Code Playgroud)

但是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)
Run Code Online (Sandbox Code Playgroud)

我真的很想了解这里发生了什么,但我对于下一步该看哪里感到有点失落.有什么建议?

Bil*_*ill 475

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

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

更新(3/2016):

我收到了很多反应,特别是我检查了我的代码所依赖的包.几天前,有人未发布他们所有的软件包(https://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c#.kq9s64clp),这些软件包破坏了React,Babel和几乎所有东西其他.希望现在很清楚,如果你有生产代码,你就不能依赖NPM来实际维护你的依赖关系.

  • "我通常会在本地安装大多数软件包,以便与项目代码一起检入." 通常更好的做一个`package.json`列出你依赖的npm模块并忽略`node_modules`文件夹.然后只需`npm install`即可在克隆repo后进行设置. (263认同)
  • 作为一个老开发人员,当我读取Node devs"范例""磁盘空间便宜"时,我几乎窒息了.我有我正在使用的库.我可能有100份副本(或更糟糕的是,NEAR副本)的想法让我的胃转了.磁盘空间很便宜,但维护时间很长.也许如果你正在做一次性玩具项目,维护很便宜.然而,对于实际工作而言,维护是昂贵的并且与磁盘空间的成本无关. (156认同)
  • 我真的不明白这最后的评论.没有人说拥有任何代码片段的100份副本,只需拥有项目所依赖的代码的1份副本.如果NPM或依赖关系有一天消失,则替代方案是具有非功能性项目.我认为从头开始重写依赖也很昂贵.顺便说一句,我在Microsoft工作了10年,我们总是在源代码树中检查第三方依赖项. (61认同)
  • 除了列出依赖关系的`package.json`之外,我还想保留我所依赖的东西的良好副本.磁盘空间很便宜,如果npm或包从npm消失,我仍然会在我的仓库中有一个完全正常工作的项目. (51认同)
  • @LloydSargent拥有"NEAR副本"*不会更糟糕,它会更好*,因为每个项目都有一个特定的依赖项,你已经定义了,其余的代码依赖于它.如果您在多个项目中拥有*相同*版本,那么如果您更新*任何*您*必须*更新*所有*.固定依赖关系允许零碎升级 - 基本上*更少*维护.真正的工作,非玩具项目. (32认同)
  • 因此:https://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c#.kq9s64clp.有人去了,未发表他们所有的模块.我的构建都很好,其他人怎么都公平? (14认同)
  • @Bill,我完全同意你的政策.一些反应的普及是非常令人不安的.我对修订控制的想法并不涉及对未知第三方的未来行为做出假设. (6认同)
  • @DaveNewton是的.这就是Node开发人员所说的:磁盘空间很便宜,因此将代码库复制到多个项目中.他们完全跳过了如果更新库那么必须更新多个副本的部分.这是我的帖子. (4认同)
  • 我弄清楚我做错了什么.将"npm install ../faye"更改为"npm install ../faye/bu​​ild"后,它按预期工作.我不知道这是多么典型,但是faye在构建时会创建一个构建目录并将package.json的副本放在那里.npm不会在根级别抱怨package.json,但它会引用该级别不存在的文件. (3认同)
  • @Bill-node 允许一种相当低效的模块组织方式,npm 滥用这种方式来定期创建极其深入且冗余的模块依赖关系嵌套。对于任何模块,该模块的依赖项可能存在于与模块相同的级别,或者存在于模块的目录中,通常称为“node_modules”。因此,如果您的 package.json 中列出了 5 个模块,并且每个模块都依赖于(或具有依赖于)任何其他特定包,则 npm 的默认行为是在每个模块的 node_modules 目录下安装依赖项的副本。 (2认同)
  • npm shrinkwrap我相信它会确保,如果在版本控制(git)中忽略节点模块,项目中所有依赖项的版本保持一致,并且它将始终使用最初使用的版本,并且正在使用在另一台机器上运行npm install时,该项目可以处理项目. (2认同)

Abh*_*ngh 425

我有一个非常相似的问题.删除整个node_modules文件夹并重新安装为我工作:

rm -rf node_modules
npm install
Run Code Online (Sandbox Code Playgroud)

  • 我必须做两次才能让一切正常 (22认同)
  • 我也会做一个npm缓存清理,就像一个安全的事情:) (11认同)
  • 这适合我.我正在评论,因为这对我来说非常适合NPM/Node情况. (4认同)
  • 这里缺少的步骤是在运行`npm install`之前删除package-lock.json文件。 (3认同)
  • 每当出现奇怪的依赖问题时,可能是一个很好的故障排除步骤,`npm install`/`npm update` 无法解决。这解决了当我尝试运行 Express 应用程序时随机开始显示“错误:找不到模块‘http-errors’”的问题。 (2认同)

Piy*_*dia 77

npm install --save module_name
Run Code Online (Sandbox Code Playgroud)

例如,如果错误是:

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

然后您可以通过执行命令来解决此问题npm install --save form-data.


mgt*_*s99 19

对于TypeScript用户,如果要导入内置节点模块(例如http,pathurl),并且遇到错误,"Cannot find module "x"则可以通过运行修复错误

npm install @types/node --save-dev
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*ner 17

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

npm首次检查出错了,所以最好选择删除文件并重新启动npm install.

  • 这对我来说是诊断出来的问题.我最终做了`npm cache clear`并清除了node_modules,接着是'npm install`来解决我的问题. (16认同)

Ily*_*off 9

如果使用nvm,请检查是否为正确的Node.js版本编译了绑定到其他库的现有node_modules.

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

我们还使用pm2工具进行部署.

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

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

当nvm setings生效时,我通过重启pm2来解决这个问题.还应该修复启动脚本.


uko*_*ath 6

我昨天遇到此错误。花了我一段时间才意识到,其中的main条目package.json指向了我已移动的文件。一旦我更新,错误消失了,程序包正常工作了。

  • 神圣的牛...出于绝望,我在Google中输入了“错误:找不到模块”,发现了这个问题。您的回答解决了我的问题。我不敢相信如此模糊的搜索词会找到正确的答案。感谢您和Google! (2认同)
  • 非常这个。我已经设法将我的子模块的 `main` 条目指向一个从其存储库中排除的目录中,因此当我尝试通过 `npm install` 包含它时,它起作用了,但是在需要时没有找到导出!非常感谢这个明显但有用的答案。 (2认同)
  • 谢谢你。我在使用 Yarn 工作区时遇到了这种情况,因此正在寻找路径解析算法和各种类型。:) 我被错误消息谈论“定位”模块的方式所困扰,而且 ESLint 也给出了类似的错误消息。然后我看到你的回答,意识到我是个傻子。谢谢! (2认同)

MrC*_*nky 6

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

在将-based 模块browserify转换为 CommonJS require-able 模块时发现;browserify不关心缺失的main字段,所以错误没有被注意到。


Pra*_*evi 5

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

>myApp>npm install
Run Code Online (Sandbox Code Playgroud)

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


Sou*_*nti 5

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

rm -rf node_modules
rm package.json
rm package-lock.json
svn up
npm install
ng build --env=prod
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助!

  • 如果删除 `package.json`,NPM 如何知道要安装什么? (20认同)

小智 5

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


jam*_*ace 5

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

npm link package_name
Run Code Online (Sandbox Code Playgroud)

例如

npm link webpack
npm link autoprefixer
Run Code Online (Sandbox Code Playgroud)

等等

  • 如有解释,将不胜感激! (2认同)
  • 解释一下,有人! (2认同)

Xak*_*iru 5

rm package-lock.json
rm -r node_modules
npm i
Run Code Online (Sandbox Code Playgroud)

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


小智 5

  • 逐步运行以下命令:

  • npm cache clean -force

  • rm package-lock.json

  • rm -r node_modules

  • npm i --save --legacy-peer-deps