168

我正在尝试在 Mac OSX Lion 上设置节点。一切似乎都正常,但我似乎无法从我的全局模块文件夹中导入任何模块。我得到错误,

Error: Cannot find module <module>

如果我运行这个:node -e require.paths,我得到的响应是:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

这是正确的,我的模块确实安装在 /usr/local/lib/node_modules 中。但是,当我尝试运行脚本时,我得到了这个:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

我的 .bash_profile 看起来像这样:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

非常感谢一些帮助,我不知道为什么我不能导入任何库。

4

9 回答 9

141

如果你使用 npm >=1.0,你可以使用npm link <global-package>创建一个本地链接到已经全局安装的包。(警告:操作系统必须支持符号链接。

然而,这并非没有问题。

npm link 是一个开发工具。管理本地开发箱上的包非常棒。但是使用 npm link 进行部署基本上是在自找麻烦,因为它使得在不知不觉中更新事物变得超级容易。

作为替代方案,您可以在本地和全局安装包。

有关其他信息,请参阅

于 2011-11-01T18:56:17.030 回答
140

Node.js 使用环境变量NODE_PATH来允许指定要包含在模块搜索路径中的其他目录。您可以使用npm它自己来告诉您使用命令将全局模块存储在哪里npm root -g。因此,将这两者放在一起,您可以使用以下命令确保全局模块包含在您的搜索路径中(在 Linux-ish 上)

export NODE_PATH=$(npm root --quiet -g)

于 2017-04-19T19:40:12.890 回答
72

您可以使用 npm link 在项目文件夹中创建指向全局包的符号链接。

例子:

$ npm install -g express
$ cd [local path]/project
$ npm link express

它所做的只是创建一个本地 node_modules 文件夹,然后创建一个符号链接 express -> [global directory]/node_modules/express ,然后可以通过require('express')

于 2014-04-27T00:14:32.557 回答
25

全局安装任何软件包,如下所示:

$ npm install -g replace  // replace is one of the node module.

由于这个替换模块是全局安装的,所以如果你看到你的节点模块文件夹,你不会在那里看到替换模块,所以你不能使用 require('replace') 来使用这个包。

因为使用 require 您只能使用节点模块文件夹中存在的本地模块。

现在要使用全局模块,您应该使用以下命令将其与节点模块路径链接。

$ npm link replace

现在返回并查看您的节点模块文件夹,您现在可以在那里看到替换模块,并且可以在您的应用程序中将其与 require('replace') 一起使用,因为它与您的本地节点模块链接。

请让我知道是否需要进一步澄清。

于 2015-11-27T07:57:12.613 回答
16

您可以将 require 与全局模块目录的路径一起用作参数。

require('/path/to/global/node_modules/the_module');

在我的 Mac 上,我使用这个:

require('/usr/local/lib/node_modules/the_module');

如何找到你的全局模块在哪里?--> npm 在哪里安装包?

于 2016-09-15T06:00:26.413 回答
9

将环境变量 NODE_PATH 设置为指向您的全局node_modules文件夹。

在 Windows 7 或更高版本中,路径类似于%AppData%\npm\node_modules在 UNIX 中可能类似于/home/sg/.npm_global/lib/node_modules/但它取决于用户配置。

该命令npm config get prefix可以帮助找出正确的路径。

在 UNIX 系统中,您可以使用以下命令完成它:

export NODE_PATH=`npm config get prefix`/lib/node_modules/
于 2018-05-28T06:12:20.177 回答
3

简单的答案是在 npm 全局根目录中运行 node。

cd $( npm root -g ) && node
于 2021-04-20T19:09:38.993 回答
0

我正在使用 Docker。我正在尝试创建一个安装了所有节点依赖项的 docker 映像,但可以在容器运行时使用我的本地应用程序目录(而不用 node_modules 目录或链接污染它)。这会导致在这种情况下出现问题。我的解决方法是从模块所在的确切路径中获取,例如 require('/usr/local/lib/node_modules/socket.io')

于 2016-01-28T16:02:47.390 回答
-2

require.paths已弃用。

转到您的项目文件夹并键入

npm install socket.io

这应该将它安装在节点将查找它的本地 ./node_modules 文件夹中。

我的东西是这样的:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

创建一个 app.js 文件

// app.js
var socket = require('socket.io')

现在运行我的应用程序

node app.js

确保您使用的是npm >= 1.0and node >= 4.0

于 2011-11-01T19:01:09.787 回答