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

时间:2012-09-26 04:25:59

标签: node.js npm

我写了一个模块,我刚刚发布到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为空。不知道如何解决这个问题。

17 个答案:

答案 0 :(得分:335)

对于遇到此问题的其他人,由于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')现在成功了。

答案 1 :(得分:32)

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

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

答案 2 :(得分:14)

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

答案 3 :(得分:10)

对于某些人(比如我),没有其他工作,请试试这个:

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Created by dustin.schultz on 12/14/15.
 */

@SpringApplicationConfiguration(classes = FooBar.TestApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "foo=${random.value}", "bar=${foo}" })
public class FooBar
{
    @Value("${foo}")
    private String foo;

    @Value("${bar}")
    private String bar;

    @Test
    public void foo()
    {
        assertThat(foo, is(bar));
    }

    @Configuration
    @EnableAutoConfiguration
    public static class TestApplication
    {

    }
}

希望它可以帮助某人:)

答案 4 :(得分:8)

我得到了&#34;乐观主义者&#34;模块错误,我刚刚做了#34; npm install&#34;解决它。过了那个错误。

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

答案 5 :(得分:5)

request-promise我遇到了这个问题。在我的情况下,替换:

npm install request-promise --global

npm install request-promise --cli

工作(source

另外,尝试设置环境变量

NODE_PATH=%AppData%\npm\node_modules

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

在我的情况下,nodenpm都在同一路径(/usr/bin)。 NODE_PATH为空,因此npm将全局模块放入/usr/lib/node_modules require(...)成功找到它们。 唯一的例外是npm模块,它随nodejs包一起提供。由于我使用的是64位系统,因此它被放入/usr/lib64/node_modules。如果空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。

答案 8 :(得分:1)

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

  

为了最大限度地减少权限错误的可能性,您可以将npm配置为   使用不同的目录。在这个例子中,它将是一个隐藏的   您的主文件夹上的目录。

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

  2.   
  3. 为全局安装创建目录:

         

    mkdir~ / .npm-global

  4.   
  5. 配置npm以使用新目录路径:

         

    npm config set prefix&#39;〜/ .npm-global&#39;

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

         

    export PATH =〜/ .npm-global / bin:$ PATH

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

         

    source~ / .profile

  10.   
  11. 测试:全局下载包而不使用sudo。

         

    npm install -g jshint

  12.         

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

    id

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

答案 9 :(得分:1)

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

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

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

注意:

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

答案 10 :(得分:1)

我这样做的方式很简单......

  1. 从控制面板[Windows 7]
  2. 取消安装节点
  3. 再次安装节点
  4. 安装量角器 npm install --global --verbose protractor
    更新网络驱动程序管理器。
  5. 对我来说很好。

    希望这可以帮助你......

答案 11 :(得分:1)

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

npm link wisp

答案 12 :(得分:1)

在Windows上,如果你刚刚进行了全新安装而你得到了这个,你需要在\ AppData \ Roaming

中吹掉你的npm缓存

答案 13 :(得分:1)

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

答案 14 :(得分:0)

我遇到与OP相同的错误,但是我可以看到日志sh: node: command not found

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

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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