从GitHub上拉下一个模块,并按照说明进行构建后,我试着用以下方法将其拉入一个现有的项目。
> npm install ../faye
这似乎是个好办法。
> npm list
/home/dave/src/server
└─┬ [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
但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)
我真的想了解这里发生了什么,但我有点不知所措,不知道下一步该去哪里找。有什么建议吗?
使用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://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c#.kq9s64clp),这破坏了React、Babel和其他几乎所有的东西。 希望现在已经很清楚,如果你有生产代码,你不能依靠NPM为你实际维护你的依赖关系。
npm install --save module_name
例如,如果错误是。
{fnTahomafs10bord0shad01cH00FFFF}> { [Error: Cannot find module '/root/.npm/form-data'] code: 'MODULE_NOT_FOUND' }
那么你可以通过执行npm install --save form-data
命令来解决这个问题。
对于TypeScript用户来说,如果你正在导入一个内置的Node模块(如http
、path
或url
),并且你得到了一个错误,如"Cannot find module "x"
,那么这个错误可以通过运行以下命令来解决
npm install @types/node --save-dev
该命令将把NodeJS TypeScript定义导入到你的项目中,允许你使用Node'的内置模块。
当第一次[npm][1]安装因某种原因崩溃时,就会发生这种情况 (npm的SIGINT),或者延迟时间太长,或者数据损坏。 再次尝试安装npm不会挽救这个问题。
npm第一次检查时出了问题,所以最好的选择是删除该文件,然后重新开始npm安装。
[1]: https://en.wikipedia.org/wiki/Npm_(软件)
如果你使用nvm,请检查现有的绑定到其他库的node_modules是否为正确的Node.js版本编译。
我也遇到了同样的错误。 原因如下。 我们使用了nvm,因为我们在服务器上运行了两个应用程序,一个需要Node.js 5.6,因为它使用了node-gd(暂时不在Node.js 6上运行),另一个需要Node.js 6。 Node.js 6是[apt-get][1]安装的。
另外,我们还使用pm2工具来部署。
所以,默认的设置是pm2进程是在nvm没有生效的时候启动的,所以它使用的是apt-get安装的Node.js(版本6)。 所以主pm2守护进程用Node.js 6启动。 如果我在fork模式下运行应用程序,它们会在单独的进程中启动,并且nvm设置是有效的。 当我在集群模式下运行应用程序时--它们继承了非nvm环境。
因此,当我试图切换到集群模式时,应用程序无法启动,因为为5.6编译的绑定失败,并出现了这条消息。
我'已经通过在nvm设置生效时重启pm2来解决这个问题。 此外,启动脚本也应该得到修正。
[1]: https://en.wikipedia.org/wiki/Advanced_Packaging_Tool#apt-get
如果你 "require "的模块在其package.json中缺少或不正确的 "main "字段,就会遇到这个错误。
虽然模块本身已经安装好了,但npm/node必须使用一个单独的.js文件作为模块的入口。
如果main
字段不在那里,它默认在你的模块'文件夹中寻找index.js
。
如果你的模块'的主文件不是*叫index.js,它将无法require
它。
在把一个基于browserify
的模块变成CommonJSrequire
-able模块时发现的。
browserify
并没有在意缺少的main
字段,所以这个错误没有被发现。
我试图发布我自己的包,然后把它包含在另一个项目中。 我有这个问题,因为我如何'已经建立了第一个模块。 我使用ES2015导出来创建模块,例如,让我们说模块看起来是这样的。
export default function(who = 'world'){
return `Hello ${who}`;
}
与巴别尔一起编撰后,在出版之前。
'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;
。
实际得到导入的包。
希望能帮到你
只是发现了一个不寻常的情况,可能对某人有用,也算是红颜祸水吧。
我也得到了无法找到模块的错误,但奇怪的是,在我的本地(Mac托管)Node.js环境中,一切都完美地工作。 这个问题只有在我们的Linux服务器上部署代码时才会出现。
那么... 原来是一个拼写错误,(显然)基于Mac的Node.js安装非常乐意忽略。
包含的内容是这样的。
var S3Uploader = require('./S3Uploader.class');
但实际的文件叫"s3Uploader.class.js"。
注意到's'中的套管区别。 与's'中的套管区别。 'S' 代码和文件名之间的区别。
所以--万一这里的其他解决方案都不能解决您的问题,请仔细检查您是否在您的文件名中使用了错误的字符编码! :)
和DUH!