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

Posted

技术标签:

【中文标题】NPM 全局安装“找不到模块”【英文标题】:NPM global install "cannot find module" 【发布时间】:2012-09-17 15:42:47 【问题描述】:

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

所以它可以从命令行正常安装:

$ npm i -g wisp

但是,当我从命令行运行它时,我不断收到一个未安装 optimist 的错误:

$ 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 选项会发生什么? 它在当前目录中安装了一个 node_modules 文件夹,里面有 wisp。 我知道。还是报错? 是的。如果我在执行本地 npm i wisp 后尝试运行 wisp,仍然返回相同的错误 我刚刚安装了你的模块。它对我来说很好。你的小精灵在哪里?就我而言,我运行了./node_modules/wisp/wisp,效果很好。 【参考方案1】:

高山/容器化

正如其他地方提到的,解决方案是烘焙到您的图像中,

NODE_PATH=/usr/local/lib/node_modules/

我也有opened up an issue upstream with npm apk so this gets set

【讨论】:

【参考方案2】:

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

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

【讨论】:

默认情况下就在那里。对于用户,它已加载,但在以 root 身份运行时不是,因此需要包含在 root 用户的路径中。【参考方案3】:

遇到了同样的问题,并通过在我的 zshrc 中添加以下行来解决它。 根据您的 shell,您可以尝试在您的 rc 文件中添加 bash 和 zsh - bashrc/zshrc 文件存在于您的主位置。

export NODE_PATH="/usr/local/lib/node_modules"

要直接添加zshrc文件,运行这个命令

echo 'export NODE_PATH="/usr/local/lib/node_modules"' >> ~/.zshrc

【讨论】:

【参考方案4】:

以下通用修复适用于任何模块。例如request-promise。 替换

npm install request-promise --global

npm install request-promise --cli

工作 (source) 以及 globalsinherits

另外,尝试设置环境变量

NODE_PATH=%AppData%\npm\node_modules

【讨论】:

npm install 上没有 --cli 参数。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

Mac 用户最好使用手动安装:

为了尽量减少权限错误的机会,您可以将 npm 配置为 使用不同的目录。在这个例子中,它将是一个隐藏的 主文件夹中的目录。

    在开始之前备份您的计算机。

    为全局安装创建一个目录:

    mkdir ~/.npm-global

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

    npm 配置设置前缀 '~/.npm-global'

    打开或创建一个 ~/.profile 文件并添加以下行:

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

    回到命令行,更新你的系统变量:

    来源 ~/.profile

    测试:不使用 sudo 全局下载包。

    npm install -g jshint

您可以使用相应的 ENV 变量(例如 如果你不想修改 ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global

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

【讨论】:

【参考方案8】:

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

对于 Windows ,正如其他答案所暗示的那样,您需要一个干净的 Node installation :

卸载 Node.js 删除C:\Users\user\AppData\Roaming中的npmnpm_cache这两个文件夹 重启 Windows 并安装 Node.js 运行npm init或(npm init --yes for default config) 为NODE_PATH 设置Windows 环境变量。此路径是您的软件包的安装位置。可能类似于NODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules 启动一个新的 cmd 控制台,npm 应该可以正常工作

注意:

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

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

我以简单的方式做到了这一点......

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

对我来说很好。

希望对你有所帮助....

【讨论】:

【参考方案11】:

就我而言,nodenpm 都在同一路径中 (/usr/bin)。 NODE_PATH 是空的,所以 npm 将全局模块放入 /usr/lib/node_modules 中,require(...) 成功找到它们。 唯一的例外是 npm 模块,它随 nodejs 包一起提供。由于我使用的是 64 位系统,因此将其放入 /usr/lib64/node_modules。这不是 require(...) 在空 NODE_PATH 和节点从 /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。

【讨论】:

【参考方案12】:

对于 Windows,来自 Nodejs cannot find installed module on Windows? 对我有用的是运行 npm link

npm link wisp

【讨论】:

请注意 - 我这样做了,但无法将我的压缩代码与 AWS lambda 一起使用。我必须像 npm install wisp --save 一样在本地创建 node_module(没有 -g 选项)【参考方案13】:

在 Windows 上,如果您刚刚进行了全新安装并且得到了这个,您需要清除 \AppData\Roaming 中的 npm 缓存

【讨论】:

【参考方案14】:

对于一些(比如我)没有其他方法的人,试试这个:

brew cleanup
brew link node
brew uninstall node
brew install node

希望它可以帮助某人:)

【讨论】:

【参考方案15】:

root 下运行Ubuntu 的测试服务器之一上遇到了同样的问题。然后使用useradd -m myuser 和installed everything(nvmnode,包)作为myuser 创建一个新用户。现在它工作正常。

【讨论】:

【参考方案16】:

我得到了“乐观主义者”模块错误,我只是做了“npm install”来解决它。克服了那个错误。

https://github.com/mbloch/mapshaper/issues/12

【讨论】:

【参考方案17】:

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

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

【讨论】:

以非操作系统特定的方式做到这一点的任何方式? @UpTheCreek 这一种非操作系统特定的方式。这是 JS 代码,你只需要指向一个 node_modules 有你正在寻找的模块 @Adelin - 这是一个特定于操作系统的解决方案,因为全局 node_modules 的位置是特定于操作系统的。例如。如果您在 Windows 上开发,并在生产环境中运行 linux,那么这不是一个很好的解决方案。 这很容易克服。例如,您可以将节点路径保存在 env 变量中,然后将硬编码路径替换为 os.environ.nodepath(类似这些行)。 macOS Mojave 10.14.6 需要将 export NODE_PATH=/usr/local/lib/node_modules/npm/node_modules 添加到 ~/bash_profile 中,因为本机 .js 代码不受影响,因此更加独立于机器。 【参考方案18】:

默认情况下,node 不会在 /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 。 (如加载模块节点的链接中所述,将在此路径中搜索并起作用)

【讨论】:

【参考方案19】:

对于遇到此问题的其他人,我遇到此问题是因为我的 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)

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

export NODE_PATH=/opt/lib/node_modules

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

【讨论】:

在哪里设置这个 NODE_PATH ?? @sandy 在哪里设置 NODE_PATH 环境变量取决于您的操作系统。我使用的是 Linux 风格,所以我使用 export NODE_PATH=... 将其设置在本地 shell 中,以便将其导出到在该 shell 中运行的命令。要使更改对所有 shell 持久或可用,请将其放在 .profile 或类似文件中。整个概念对于新手来说非常复杂,请尝试阅读 help.ubuntu.com/community/EnvironmentVariables 。对于 Windows,您需要切换到 Linux。好吧,开个玩笑。试试computerhope.com/issues/ch000549.htm 或谷歌吧。 对于 OSX Lion,以下为我工作... export NODE_PATH=/usr/local/lib/node_modules 我使用“定位节点模块”来追踪正确的路径。 NODE_PATH 也适用于 WINDOWS。这根植于节点模块,可以在本地和全局安装。 如果您在 Mac OS X 上使用 Homebrew 安装了 Node.js:在终端中运行 open -a TextEdit ~/.bash_profile,然后将 export NODE_PATH=/usr/local/lib/node_modules 添加到文件末尾。重新启动终端窗口。现在运行echo $NODE_PATH 应该会打印出/usr/local/lib/node_modules

以上是关于NPM 全局安装“找不到模块”的主要内容,如果未能解决你的问题,请参考以下文章

nodejs require模块找不到怎么解决?

出现错误,错误:npm install 后找不到模块“express”

安装后找不到异步

module.js:540错误:找不到模块'semver'

NPM 无法安装 appjs。错误:找不到模块 'graceful-fs'

通过 npm 安装的引导程序引发有关“错误:找不到模块 'jQuery'”的错误