如何在节点中导入全局模块? 我得到“错误: 无法找到模块 < 模块 >”?

我试图在 Mac OSX Lion 上设置 Node。看起来一切正常,但是我似乎不能从我的全局模块文件夹中导入任何模块。我知道错了,

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 _ module 中。然而,当我尝试运行一个脚本时,我得到了这样的结果:

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/"

如果您能提供一些帮助,我将不胜感激,我不知道为什么我不能导入任何图书馆。

132258 次浏览

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

然而,这并非没有问题。

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

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

有关其他信息,请参见

不推荐使用 require.paths

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

npm install socket.io

它应该安装在本地./node _ module 文件夹中,node 将在该文件夹中查找它。

我的东西都是这样的:

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

创建一个 app.js 文件

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

现在运行我的应用程序

node app.js

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

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

例如:

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

它所做的就是创建一个本地 node _ module 文件夹,然后创建一个 symlink Express-> [ global directory ]/node _ module/Express,然后可以通过 require('express')解析它

在全球范围内安装任何软件包如下:

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

因为这个替换模块是全局安装的,所以如果您看到您的节点模块文件夹,您不会看到替换模块,所以您不能使用这个包使用要求(’替换’)。

因为根据需要,您只能使用节点模块文件夹中的本地模块。

现在要使用全局模块,您应该使用下面的命令将它与节点模块路径链接起来。

$ npm link replace

现在返回并查看您的节点模块文件夹,您现在可以看到替换模块,并且可以在您的应用程序中使用它,因为它与您的本地节点模块链接。

请让我知道,如果任何进一步的澄清是必要的。

我在利用 Docker。我尝试创建一个 docker 映像,它安装了我所有的节点依赖项,但是可以在容器运行时使用我的本地应用程序目录(而不会使用 node _ module 目录或链接污染它)。这在这个场景中会导致问题。我的解决方案是从模块的确切路径中进行请求,例如,need (’/usr/local/lib/node _ module/socket.io’)

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

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

在我的 Mac 电脑上,我用这个:

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

如何找到你的全局模块在哪里? —— > Npm 在哪里安装软件包?

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

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

将环境变量 NODE _ PATH 设置为指向全局 node_modules文件夹。

在 Windows7或更高版本中,路径类似于 %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/

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

cd $( npm root -g ) && node

如果你在 windows cmd 上,你可以通过 FOR/f“ tokens = * delims =”% A in (‘ npm root —— static-g’)设置“ NODE _ PATH =% A”或者 FOR/f“ tokens = * delims =”% A in (‘ npm root —— static-g’)设置“ NODE _ PATH =% A”在一个批处理文件中。