NPM全局安装“找不到模块”


206

我写了一个模块,我刚才将其发布到npm(https://npmjs.org/package/wisp)

因此,可以从命令行进行安装:

$ npm i -g wisp

但是,当我从命令行运行它时,我不断收到未安装乐观主义者的错误消息:

$ wisp 
Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

但是,我在package.json中指定了依赖性:

{
  "name": "wisp",
  "author": "Brendan Scarvell <bscarvell@gmail.com>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

有谁知道该怎么做才能运行?我知道它与bin部分有关,将可执行文件添加到bin中,该目录中的node_modules为空。不知道该如何解决。


如果不使用-g选项进行安装会怎样?
vinayr 2012年

它将在当前目录中安装一个node_modules文件夹,其中包含wisp。
Menztrual 2012年

我知道。还是会出错?
vinayr 2012年

是的 如果我尝试在执行本地npm i wisp之后运行wisp,仍然会返回相同的错误
Menztrual 2012年

我刚刚安装了您的模块。对我来说很好。你的小精灵在哪里?就我而言,我跑的./node_modules/wisp/wisp很好。
vinayr 2012年

Answers:


370

对于遇到此问题的其他人,由于我npm将其安装到不在我的位置上而遇到了这个问题NODE_PATH

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

我的NODE_PATH为空,运行npm install --global --verbose promised-io显示它正在安装到中/opt/lib/node_modules/promised-io

[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli   '/opt/bin/npm',
npm verb cli   'install',
npm verb cli   '--global',
npm verb cli   '--verbose',
npm verb cli   'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]

我的脚本失败require('promised-io/promise')

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

module.js:340
    throw err;
          ^
Error: Cannot find module 'promised-io/promise'
    at Function.Module._resolveFilename (module.js:338:15)

我可能使用的源安装了node和npm configure --prefix=/opt。我不知道为什么这使他们无法找到已安装的模块。现在的解决方法是将NODE_PATH指向正确的目录:

export NODE_PATH=/opt/lib/node_modules

require('promised-io/promise')现在成功了。


10
在哪里设置此NODE_PATH?
桑迪

8
设置NODE_PATH环境变量的@sandy取决于您的操作系统。我使用的是Linux,因此我曾经export NODE_PATH=...在本地shell中进行设置,以便将其导出到在该shell中运行的命令。要使更改持久化或对所有shell可用,请将其放在.profile或类似文件中。整个概念对于新手来说非常复杂,请尝试阅读help.ubuntu.com/community/EnvironmentVariables。对于Windows,您需要切换到Linux。好,开个玩笑。尝试computerhope.com/issues/ch000549.htm或对其进行Google搜索。
2013年

13
对于OSX Lion,以下对我有用的工作……export NODE_PATH = / usr / local / lib / node_modules我使用“ locate node_modules”来跟踪正确的路径。
13年

2
NODE_PATH也适用于WINDOWS。这根植于节点模块,可以在本地和全局安装。
zinking 2014年

5
如果您在Mac OS X上安装了带有Homebrew的Node.js:open -a TextEdit ~/.bash_profile在Terminal中运行,然后添加export NODE_PATH=/usr/local/lib/node_modules到文件末尾。重新启动终端窗口。现在运行echo $NODE_PATH应该打印出来/usr/local/lib/node_modules
Pwdr 2014年

39

将其添加到prog(mac)的开头:

module.paths.push('/usr/local/lib/node_modules');


4
以非操作系统特定的方式执行此操作的任何方法?
UpTheCreek

@UpTheCreek这一个非操作系统特定的方式。它的JS代码,你只需要指向具有moduleyou正在寻找一个node_modules
Adelin

@Adelin-这是特定于操作系统的解决方案,因为全局node_modules的位置是特定于操作系统的。例如,如果您正在Windows上进行开发,并在生产环境中运行linux,那么这不是一个很好的解决方案。
UpTheCreek

这很容易克服。例如,您可以将节点路径保存在env变量中,并用os.environ.nodepath(沿着这些方式)替换硬编码的路径。
阿德林

macOS Mojave 10.14.6要求将export NODE_PATH = / usr / local / lib / node_modules / npm / node_modules添加到〜/ bash_profile,这与计算机更加独立,因为本机.js代码不受影响。
vwvan

16

缺省情况下,节点不在用于加载全局模块的/ usr / local / lib / node_module内部。请参阅http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders中说明的模块加载

因此,您必须1)将/ usr / local / lib / node_module添加到NODE_PATH并导出它,或者2)将已安装的节点模块复制到/ usr / local / lib / node。(如链接中所述,加载模块节点将在此路径中搜索并起作用)


10

对于某些(如我)没有其他作用的尝试,请尝试以下操作:

brew cleanup
brew link node
brew uninstall node
brew install node

希望它可以帮助某人:)


9

以下通用修补程序适用于任何模块。例如使用request-promise

更换

npm install request-promise --global

npm install request-promise --cli

工作(来源globals以及inherits

另外,尝试设置环境变量

NODE_PATH=%AppData%\npm\node_modules


3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"

默认情况下在那里。对于用户而言,它已加载,但不是以root身份运行,因此需要包含在root用户的路径中。
stamster


2

对于Mac用户,最好使用手动安装:

为了最大程度地减少权限错误的可能性,您可以将npm配置为使用其他目录。在此示例中,它将是您的主文件夹上的隐藏目录。

  1. 开始之前,请备份计算机。

  2. 创建用于全局安装的目录:

    mkdir〜/ .npm-global

  3. 配置npm以使用新的目录路径:

    npm config设置前缀'〜/ .npm-global'

  4. 打开或创建〜/ .profile文件并添加以下行:

    导出PATH =〜/ .npm-global / bin:$ PATH

  5. 返回命令行,更新系统变量:

    来源〜/ .profile

  6. 测试:在不使用sudo的情况下全局下载软件包。

    npm install -g jshint

可以使用相应的ENV变量代替步骤2-4(例如,如果您不想修改〜/ .profile):

NPM_CONFIG_PREFIX=~/.npm-global

参考:https : //docs.npmjs.com/getting-started/fixing-npm-permissions


1

在.NET Ubuntu下运行的其中一台测试服务器上出现了相同的问题root。然后创建使用新的用户useradd -m myuser,并安装了一切nvmnode,包)作为myuser。现在一切正常。


1

在Windows上,如果您只是进行了全新安装,则需要在\ AppData \ Roaming中删除npm缓存


1

就我而言,nodenpm都在同一路径(/usr/bin)中。的NODE_PATH为空,因此npm将全局模块放置/usr/lib/node_modulesrequire(...)成功找到它们的位置。唯一的例外是npmnodejs软件包随附的模块。由于我使用的是64位系统,因此将其放入/usr/lib64/node_modules。如果为空NODE_PATH且节点从开始,则这不是require(...)搜索的地方/usr/bin。所以我有两个选择:

  • 连结/usr/lib64/node_modules/npm/usr/lib/node_modules/npm
  • 将模块从/usr/lib/node_modules/*移至/usr/lib64/node_modules/并设置NODE_PATH=/usr/lib64/node_modules

两者都起作用。我正在使用OpenSUSE 42.1和更新存储库中的nodejs包。版本是4.4.5。


1

我以简单的方式做到了...

  1. 从控制面板[Windows 7]上卸载节点
  2. 再次安装节点
  3. 安装量角器 npm install --global --verbose protractor
    更新Web驱动程序管理器。

对我来说很好。

希望这对您有帮助。


1

我收到此错误,Error: Cannot find module 'number-is-nan'而模块实际上存在。这是由于Node.js安装错误/不完整所致。

对于Windows,如其他答案所建议的那样,您需要全新安装Node

  • 卸载Node.js
  • 删除两个文件夹,npm然后npm_cacheC:\Users\user\AppData\Roaming
  • 重新启动Windows并安装Node.js
  • 运行npm init或(npm init --yes默认配置
  • 将Windows环境变量设置为NODE_PATH。此路径是您的软件包的安装位置。大概是这样的NODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • 启动一个新的cmd控制台,npm应该可以正常工作

注意 :

在重新安装Node.js之前,请尝试最后一点,这样可以节省您一些时间,并避免重新安装所有软件包。


1

我刚刚遇到了axios模块的这个问题。然后,我尝试了这一点:运行rm -rf node_modulesyarn。而且有效。


0

我遇到了与OP相同的错误,但在挖掘可以看到的日志中sh: node: command not found

事实证明/ usr / bin / node程序(符号链接)不再与一起安装apt install nodejs。一旦/usr/bin/node' to符号链接的nodejs ,npm安装成功-g @ angular / cli`。

在debian上安装它的正确方法是apt install nodejs-legacy


0

我必须将C:\ Users \ {用户名} \ AppData \ Roaming \ npm添加到我的环境变量中,然后我才能安装东西。

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.