A instalação global do NPM “não consegue encontrar o módulo”


206

Eu escrevi um módulo que publiquei no npm há um momento (https://npmjs.org/package/wisp)

Portanto, ele instala bem a partir da linha de comando:

$ npm i -g wisp

No entanto, quando eu o executo na linha de comando, continuo recebendo um erro que o otimista não está instalado:

$ 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)

No entanto, eu especifiquei no package.json como uma dependência:

{
  "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"
  }
}

Alguém sabe o que fazer para fazer isso funcionar? Eu sei que tem a ver com a parte bin adicionando o executável a bin e o node_modules nesse diretório estar vazio. Não faço ideia de como resolver isso.


o que acontece se você instalar sem a opção -g?
vinayr

Ele instala uma pasta node_modules no diretório atual que possui wisp dentro disso.
Menztrual 26/09/12

Eu sei. Você ainda recebe erro?
Vinayr 26/09/12

Sim. Se eu tentar executar WISP depois de fazer um npm locais i wisp, ainda retorna mesmo erro
Menztrual

Acabei de instalar seu módulo. Está funcionando bem para mim. Onde está o seu fio? No meu caso, eu corri, o ./node_modules/wisp/wispque funciona bem.
vinayr

Respostas:


370

Para qualquer outra pessoa que enfrenta isso, tive esse problema devido à minha npminstalação em um local que não está no meu NODE_PATH.

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

Meu NODE_PATH estava vazio e a execução npm install --global --verbose promised-iomostrou que estava sendo instalado no /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]

Meu script falha em 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)

Eu provavelmente instalei o nó e o npm da fonte usando configure --prefix=/opt. Não faço ideia por que isso os tornou incapazes de encontrar os módulos instalados. A correção no momento é apontar NODE_PATH no diretório certo:

export NODE_PATH=/opt/lib/node_modules

Meu require('promised-io/promise')agora é bem sucedido.


10
onde definir este NODE_PATH ??
sandy

8
@sandy onde você define a variável de ambiente NODE_PATH depende do seu sistema operacional. Eu estou usando uma versão do Linux, então eu costumava export NODE_PATH=...configurá-lo no shell local para que ele fosse exportado para comandos executados nesse shell. Para tornar a alteração persistente ou disponível para todos os shells, coloque-o em .profile ou similar. O conceito como um todo é irritantemente complexo para o novato, tente ler help.ubuntu.com/community/EnvironmentVariables . Para Windows, você desejará mudar para o Linux. OK, estou brincando. Tente computerhope.com/issues/ch000549.htm ou pesquise no Google.
N14

13
Para o OSX Lion, o seguinte funcionou para mim ... export NODE_PATH = / usr / local / lib / node_modules Eu usei 'localizar node_modules' para rastrear o caminho certo.
K1eran

2
NODE_PATH também funciona para o WINDOWS. isso está enraizado nos módulos do nó e pode ser instalado local e globalmente.
zinking 20/05

5
Se você instalou o Node.js com o Homebrew no Mac OS X: execute open -a TextEdit ~/.bash_profileno Terminal e adicione export NODE_PATH=/usr/local/lib/node_modules-o ao final do arquivo. Reinicie a janela do terminal. Agora, a execução echo $NODE_PATHdeve ser impressa /usr/local/lib/node_modules.
Pwdr

39

adicione isso ao início de prog (mac):

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


4
Alguma maneira de fazer isso de uma maneira específica que não seja OS?
UpTheCreek

@UpTheCreek, essa é uma maneira específica não-OS. É o código JS, você só precisa apontar para um node_modules que tem a moduleyou está procurando
Adelin

@ Adelin - É uma solução específica para o SO, porque a localização do node_modules global é específica do SO. Por exemplo, se você está desenvolvendo no Windows e executando o Linux na produção, essa não é uma ótima solução.
UpTheCreek

Isso é facilmente superado. Por exemplo, você pode salvar o caminho do nó em uma variável env, por exemplo, e substituir o caminho codificado por os.environ.nodepath(algo nesse sentido).
Adelin 4/18

O macOS Mojave 10.14.6 requer a adição de exportação NODE_PATH = / usr / local / lib / node_modules / npm / node_modules para ~ / bash_profile, que é mais independente da máquina, pois o código .js nativo não é afetado.
precisa saber é o seguinte

16

Por padrão, o nó não procura dentro do / usr / local / lib / node_module para carregar módulos globais. Consulte o carregamento do módulo explicado em http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Portanto, você deve 1) adicionar o / usr / local / lib / node_module ao NODE_PATH e exportá-lo ou 2) copiar os módulos do nó instalado em / usr / local / lib / node. (Conforme explicado no link para carregar o nó do módulo, procurará neste caminho e funcionará)


10

Para alguns (como eu), que nada mais funcionou, tente o seguinte:

brew cleanup
brew link node
brew uninstall node
brew install node

Espero que ajude alguém :)


9

A seguinte correção genérica seria para qualquer módulo. Por exemplo com request-promise.

Substituir

npm install request-promise --global

Com

npm install request-promise --cli

trabalhou ( fonte ) e também para globalseinherits

Além disso, tente definir a variável de ambiente

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"

Isso existe por padrão. Para os usuários, ele é carregado, mas, enquanto executado como root, não é, portanto, precisa ser incluído no caminho do usuário root.
Stamster 01/03


2

Para usuários do Mac, é melhor usar a instalação manual:

Para minimizar a chance de erros de permissão, você pode configurar o npm para usar um diretório diferente. Neste exemplo, será um diretório oculto na sua pasta pessoal.

  1. Faça backup do seu computador antes de iniciar.

  2. Crie um diretório para instalações globais:

    mkdir ~ / .npm-global

  3. Configure o npm para usar o novo caminho do diretório:

    prefixo do conjunto de configurações npm '~ / .npm-global'

  4. Abra ou crie um arquivo ~ / .profile e adicione esta linha:

    exportar PATH = ~ / .npm-global / bin: $ PATH

  5. De volta à linha de comando, atualize as variáveis ​​do sistema:

    source ~ / .profile

  6. Teste: faça o download de um pacote globalmente sem usar o sudo.

    npm install -g jshint

Em vez das etapas 2 a 4, você pode usar a variável ENV correspondente (por exemplo, se você não deseja modificar ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Referência: https://docs.npmjs.com/getting-started/fixing-npm-permissions


1

Teve o mesmo problema em um dos servidores de teste em execução Ubuntusob root. Em seguida, criou um novo usuário usando useradd -m myusere tudo instalado ( nvm, node, pacotes) como myuser. Agora está funcionando bem.


1

No Windows, se você fez uma instalação limpa e conseguiu isso, precisa despejar o cache npm em \ AppData \ Roaming


1

No meu caso, ambos nodee npmestavam no mesmo caminho ( /usr/bin). Como NODE_PATHestava vazio, npmos módulos globais foram colocados /usr/lib/node_modulesonde os require(...)encontravam com êxito. A única exceção foi o npmmódulo, que veio com o pacote nodejs. Desde que eu estou usando o sistema de 64 bits, foi colocado em /usr/lib64/node_modules. Não é aí que as pesquisas (...) exigem no caso de vazio NODE_PATHe de nó iniciado /usr/bin. Então, eu tinha duas opções:

  • link /usr/lib64/node_modules/npmpara/usr/lib/node_modules/npm
  • mover módulos de /usr/lib/node_modules/*para /usr/lib64/node_modules/e definirNODE_PATH=/usr/lib64/node_modules

Ambos funcionaram. Estou usando o OpenSUSE 42.1 e o pacote nodejs do repositório de atualizações. A versão é 4.4.5.


1

Eu fiz isso de maneira simples ...

  1. Desinstalar nó do painel de controle [Windows 7]
  2. Instale o nó novamente
  3. Instale o transferidor npm install --global --verbose protractor
    Atualizar o gerenciador de driver da web.

funciona bem para mim.

Espero que isso ajude você....


1

Eu recebi esse erro Error: Cannot find module 'number-is-nan' enquanto o módulo realmente existe. Isso ocorreu devido a uma instalação incorreta / incompleta do Node.js.

Para Windows, como outras respostas sugerem, você precisa de uma instalação limpa do :

  • Desinstalar o Node.js
  • Exclua as duas pastas npmenpm_cache emC:\Users\user\AppData\Roaming
  • Reinicie o Windows e instale o Node.js
  • Execute npm initou ( npm init --yespara configuração padrão )
  • Defina a variável de ambiente do Windows para NODE_PATH. Este caminho é onde seus pacotes estão instalados. Provavelmente é algo comoNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Inicie um novo console do cmd e npmdeve funcionar bem

Nota :

Experimente os últimos pontos antes de reinstalar o Node.js, pois você pode economizar algum tempo e evitar reinstalar todos os seus pacotes.


1

Acabei de conhecer esse problema do axiosmódulo. Então eu tentei o seguinte: execute rm -rf node_modulese yarn. E isso funciona.


0

Eu tive o mesmo erro do OP, mas vasculhando os logs que pude ver sh: node: command not found.

Acontece que o programa / usr / bin / node (link simbólico) não está mais instalado apt install nodejs. Uma vez que o /usr/bin/node' tonodejs vinculado, vinculado ao npm npm install -g @ angular / cli` foi bem-sucedido.

A maneira correta de instalar isso no debian é apt install nodejs-legacy.


0

Eu tive que adicionar C: \ Users \ {Nome de usuário} \ AppData \ Roaming \ npm às minhas variáveis ​​env e, em seguida, pude instalar coisas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.