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


615

从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)

我真的很想了解这里发生了什么,但是我对接下来的去向有些困惑。有什么建议么?


8
node_modules目录应位于项目的根目录中(视app.js情况而定)。为什么使用..npm安装路径?
亚历克斯·韦恩

1
将“ npm install ../faye”更改为“ npm install ../faye/bu​​ild”后,它可以正常工作。我不知道这有多典型,但是faye在构建时会创建一个构建目录,并在其中放置package.json的副本。npm在根级别没有抱怨package.json,但是它引用了在该级别不存在的文件。
戴夫·凯西

2
我解决了这个问题,但是并没有真正解决我的实际问题,即如何解决此问题。我将尝试提出一些改进npm和/或node的建议,以使新手更容易避免这种情况。
戴夫·凯西

1
通过这次访问链接,你可能会得到一些想法一样到底在哪其未能查找你的模块..
阿莫尔中号库卡尼

1
检查天气,您是否位于安装它的文件夹中?如果您没有全局安装它。
Ashwani Panwar

Answers:


513

使用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来真正为您维护依赖项。


264
“我通常在本地安装大多数软件包,以便它们与我的项目代码一起被检入。” 通常最好package.json列出您所依赖的npm模块,并忽略该node_modules文件夹。然后,只需npm install在克隆存储库后进行设置即可。
亚历克斯·韦恩

53
除了package.json列出依赖关系之外,我还希望保留我所依赖事物的已知良好副本。磁盘空间很便宜,如果npm或软件包从npm中消失了,那么我的存储库中仍将有一个可以正常工作的项目。
比尔

165
作为一个老开发人员,当我读到“磁盘空间便宜”的Node devs“范式”时,我差点cho住了。我有正在使用的库。我可能拥有100份(或更糟糕的是,NEAR份)的想法使我大吃一惊。磁盘空间便宜,但是维护时间却很昂贵。也许如果您要进行一次性玩具项目,则维护成本会很便宜。但是,对于实际工作,维护成本很高,并且与磁盘空间成本无关。
Lloyd Sargent 2014年

65
我真的不明白这最后的评论。没有人说拥有任何代码段的100个副本,只是拥有项目所依赖的代码的1个副本。另一种方法是,如果NPM或依赖项有一天消失,则使该项目无法运行。我认为从头开始重写依赖项也很昂贵。顺便说一句,我在Microsoft工作了10年,我们总是将第3方依赖项检入到源代码树中。
比尔

33
@LloydSargent拥有“ NEAR副本” 并不会更糟,它会更好,因为每个项目都有一个特定的依赖项,您已经定义了该依赖项,其余代码都依赖于此。如果您在多个项目中具有相同的版本,则如果您进行任何更新,则必须进行所有更新。固定依赖项可以实现零碎的升级-大大减少了维护。实际工作,非玩具项目。
戴夫牛顿

459

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

rm -rf node_modules
npm install

13
为了安全起见,我还将清理一个npm缓存:)
Tony Tai Nguyen

1
每当出现奇怪的依赖问题npm install/ npm update无法解决时,这可能是一个很好的第一步故障排除步骤。这解决了一个问题,其中Error: Cannot find module 'http-errors'当我尝试运行Express应用程序时随机显示。
马特·沃卡斯

令人惊讶的是,@ carelesslyChoosy的答案解决了缺少的依赖关系。使用npm install进行升级和降级似乎无法使事情整洁。
eel ghEEz

3
这里缺少的步骤是在运行之前删除package-lock.json文件npm install
里克·昆茨

这对我不起作用,甚至重新启动了计算机;)
Jason G

83
npm install --save module_name

例如,如果错误是:

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

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


1
好像当我全局安装它时,npm / node-modules文件夹是空的并且我试图使用ng new project-name它显示出缺少的一些模块...我不得不使用给定的命令来安装它们。然后它解决了这个问题,但是有没有一个命令可以一次安装所有这些命令?
Vishal Nair

25

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

npm install @types/node --save-dev

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


18

这发生在第一个npm时安装由于某种原因(npm的SIGINT)而崩溃,延迟时间过长或数据损坏。再次尝试安装npm不会解决问题。

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


16
这为我诊断了问题。我最终做了npm cache clear并清除了node_modules,然后npm install修复了我的问题。
meklarian 2015年

9

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

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

另外,我们使用pm2工具进行部署。

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

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

我已通过在nvm设置生效时重新启动pm2来解决此问题。启动脚本也应该是固定的。


您如何检查?
tamj0rd2

8

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


我对此表示赞同,因为它解决了我的迫在眉睫的问题,并将我带到了这个node.js文档。但是我认为这不是一个总括的答案,因为文档指出了用于定位模块的替代策略。
Graham Klyne

6

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


2
神圣的牛...出于绝望,我在Google中输入了“错误:找不到模块”,发现了这个问题。您的回答解决了我的问题。我不敢相信如此模糊的搜索词会找到正确的答案。感谢您和Google!
Jamon Holmgren

1
这非常。我设法将main子模块的条目指向其存储库中排除的目录中,因此当我尝试通过npm install其将其包含进来时,但在需要时未找到任何导出!非常感谢这个显而易见但有用的答案。
Dragos

谢谢你 我在使用Yarn工作区时遇到这种情况,因此一直在寻找路径解析算法和各种算法。:)我被错误消息提到“定位”模块的方式所吸引,而且ESLint正在给出类似的错误消息。然后我看到了你的答案,意识到我是一个昏迷。谢谢!
Mark Birbeck

5

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

>myApp>npm install

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


您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明?
abarisone

5

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

在将browserify基于模块的模块转换为可支持CommonJS的require模块时发现;browserify不在乎丢失main字段,因此该错误已被忽略。


4

指定restler文件夹的路径,该路径将位于node_modules文件夹内,例如:var rest = require('./ node_modules / restler');

这对我有用。



2

专家提示:

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

收到的错误消息还不足以使我警惕自己的愚蠢!


2

当团队中的其他人package.json在SVN中更新时,我遇到了同样的问题。仅仅删除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再次运行一切就很好了。
TaeKwonJ​​oe

6
如果删除package.json,NPM如何知道要安装什么?
米哈尔

1

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


1

就我而言,我曾UNMET PEER DEPENDENCY redux@^3.0.0导致此错误消息,请查看所有错误消息并使用--save重新安装缺少的模块

npm install redux --save

1

删除node / npm,然后重新安装稳定版本(不是最新版本)对我来说很有效。

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

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


0

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

实际要导入的包。

希望有帮助!


0

webpack与一起使用时遇到此问题webpack-dev-middleware

已将一个文件变成一个文件夹

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

通过重新启动过程进行修复。


0

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

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

好吧……事实证明这是一个错字,显然基于Mac的Node.js安装很高兴被忽略。

包含看起来像这样:

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

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

请注意,代码和文件名之间的's'和'S'大小写不同。

因此-很有可能这里没有其他解决方案可以解决您的问题,请三重检查您没有误将包含的文件名中的字符装错了!:)

和!


1
默认情况下,osx文件系统(HFS +)不区分大小写 ...不久前发现,尽管它绝对是可配置的
giulp

0

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




-3

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

(抱歉!我不确定我是否已成功帮助解决上述错误,或者我是否违反了某些回答规则或格式,但我遇到了上述错误和其他错误,因此花了很多时间才能找到我正在编写完整的解决方案,因为如果其他人也遇到这些错误,那么他将有望在这里找到解决方案。)

因此,添加并阐述了PrashanthiDevi提供的答案,并且还添加了我的个人经验,这里是:

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

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

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

这样做的原因是使用所有必需的文件和依赖项来更新项目文件夹中的node-modules文件夹。

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

上面的步骤肯定可以解决我以前的错误,但是又抛出了一个新错误!这次的错误是Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'

但是,此错误的解决方案对我来说非常愚蠢(有趣)。我的文件夹中已经有了chromedriver文件。但是,事实证明上述错误是由于我的chromedriver文件位于selenium文件夹而不是 chromedriver文件夹内。因此,创建chromedriver文件夹并在其中复制chromedriver文件解决了我的问题!

另外,对于错误:等待WebDriver Server超时,您可以将以下代码行添加到conf.js文件中exports.config{}

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

希望这可以帮助!


-4

我得到了解决此问题的简单解决方案。

只需删除C:\ Users \ UserName \ AppData \ Roaming \ npm \

然后安装节点。

现在,您的问题将得到解决。


他正在使用Unix。不是Windows。
赛义夫·法拉

-4

仅运行以下命令:

npm install

它将在node_modules文件夹中安装所有必需的模块。



-38

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

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


2
这个答案似乎没有错,我认为否定投票是一些偏见和支持讽刺性评论的结果。
Muqsith

2
太多的否决票太多了。它并不完全模糊。它确实与接受的答案有关。答案只不过是npm install在正确的目录中进行。没有什么负面的
-shinobi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.