如何在Node中导入全局模块?我得到“错误:找不到模块<module>”?

node.js npm

86434 观看

8回复

我正在尝试在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_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/"

真的很感激一些帮助,我不知道为什么我不能导入任何库。

作者: Hanpan 的来源 发布者: 2019 年 7 月 8 日

回应 (8)


102

决定

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

然而,这并非没有问题。

npm link是一个开发工具。这是真棒对当地的发展框管理包。但是使用npm链接部署基本上是在寻找问题,因为它使得在没有意识到的情况下更新事物非常容易。

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

有关其他信息,请参阅

作者: Tadeusz Wójcik 发布者: 01.11.2011 06:56

60

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

例:

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

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

作者: Nick Sotiros 发布者: 27.04.2014 12:14

55

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

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

作者: Joel B 发布者: 19.04.2017 07:40

20

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

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

由于此替换模块是全局安装的,因此如果您看到节点模块文件夹,则不会在那里看到替换模块,因此您无法使用require('replace')来使用此软件包。

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

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

$ npm link replace

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

如果需要进一步澄清,请告诉我。

作者: user5341372 发布者: 27.11.2015 07:57

10

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

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

在我的Mac上,我用这个:

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

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

作者: ling 发布者: 15.09.2016 06:00

1

将环境变量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/
作者: Ben Xu 发布者: 28.05.2018 06:12

0

我正在使用Docker。我正在尝试创建一个已安装所有节点依赖项的docker镜像,但可以在容器运行时使用我的本地app目录(不会使用node_modules目录或链接进行污染)。这会导致此方案出现问题。我的解决方法是要求从模块的确切路径,例如require('/ usr / local / lib / node_modules / socket.io')

作者: Darin London 发布者: 28.01.2016 04:02

-1

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.0node >= 4.0

作者: Jamund Ferguson 发布者: 01.11.2011 07:01
32x32