Como soluciono o erro "Não é possível encontrar o módulo" usando o Node.js.

616

Depois de puxar um módulo do GitHub e seguir as instruções para construí-lo, tente puxá-lo para um projeto existente usando:

> npm install ../faye

Isso parece fazer o truque:

> npm list
/home/dave/src/server
└─┬ faye@0.7.1
  ├── cookiejar@1.3.0
  ├── hiredis@0.1.13
  └── redis@0.7.1

Mas o Node.js não consegue encontrar o módulo:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

Eu realmente quero entender o que está acontecendo aqui, mas estou um pouco sem saber como procurar a seguir. Alguma sugestão?

Dave Causey
fonte
8
O node_modulesdiretório é esperado para estar na raiz do seu projeto, alongisde app.jsno seu caso. Por que você usou ..o caminho de instalação do npm?
Alex Wayne
1
Após alterar "npm install ../faye" para "npm install ../faye/build", ele funciona conforme o esperado. Não sei o quão típico isso é, mas o faye cria um diretório de compilação quando é construído e coloca uma cópia do package.json lá. O npm não reclama do package.json no nível raiz, mas faz referência a arquivos que não existem nesse nível.
26812 Dave Causey
2
Eu resolvi o problema, mas realmente não obtive nenhuma solução para minha pergunta real, que era como solucionar esse problema. Vou tentar sugerir algumas sugestões para melhorar o npm e / ou o nó para facilitar para os novatos evitar essa situação.
Dave Causey
1
Passar por este link , você pode ter uma idéia como onde exatamente sua falha para procurar seus módulos ..
Amol M Kulkarni
1
Verifique o tempo em que você está na mesma pasta em que o instalou? se você não o instalou globalmente.
Ashwani Panwar

Respostas:

513

Usar npm installinstala o módulo apenas no diretório atual (em um subdiretório chamado node_modules). O app.js está localizado abaixo home/dave/src/server/? Caso contrário, e você deseja usar o módulo em qualquer diretório, é necessário instalá-lo globalmente usando npm install -g.

Normalmente, instalo a maioria dos pacotes localmente para que eles sejam verificados junto com o código do meu projeto.

Atualização (8/2019):

Atualmente, você pode usar o arquivo package-lock.json , que é gerado automaticamente quando o npm modifica o diretório node_modules. Portanto, você pode deixar de fazer check-in dos pacotes, porque controla package-lock.jsonas versões exatas dos seus node_modules que você está usando no momento. Para instalar pacotes de package-lock.jsonvez de package.jsonuso do comando npm ci.

Atualização (3/2016):

Recebi muitas críticas por minha resposta, especificamente por verificar os pacotes dos quais meu código depende. Alguns dias atrás, alguém não publicou todos os seus pacotes ( https://kodfabrik.com/journal/i-ve-just-liberated-my-modules ) que quebraram o React, Babel e quase todo o resto. Espero que esteja claro agora que, se você tiver um código de produção, não poderá confiar no NPM que realmente mantém suas dependências para você.

Conta
fonte
264
"Normalmente instalo a maioria dos pacotes localmente para que eles sejam verificados junto com o código do meu projeto." Geralmente é melhor fazer uma package.jsonlista de quais módulos npm você depende e ignorar a node_modulespasta. Em seguida, basta npm installobter a configuração depois de clonar o repositório.
Alex Wayne
53
Além de package.jsonlistar as dependências, gosto de manter boas cópias conhecidas das coisas das quais dependo. O espaço em disco é barato e se o npm ou o pacote desaparecer do npm, ainda terei um projeto totalmente funcional no meu repositório.
Bill
165
Como um desenvolvedor antigo, quase engasguei ao ler o "paradigma" dos desenvolvedores do Node de que "o espaço em disco é barato". Eu tenho bibliotecas que estou usando. A idéia de que eu possa ter 100 cópias (ou pior, cópias PRÓXIMAS) faz meu estômago revirar. O espaço em disco é barato, mas o tempo de manutenção é caro. Talvez, se você estiver realizando um projeto único de brinquedos, a manutenção seja barata. No entanto, para um trabalho real, a manutenção é cara e não afeta o custo do espaço em disco.
Lloyd Sargent
66
Eu realmente não entendo esse último comentário. Ninguém está dizendo para ter 100 cópias de qualquer parte do código, apenas para ter uma cópia do código do qual seu projeto depende. A alternativa é ter um projeto não funcional se o NPM ou a dependência desaparecer um dia. Eu acho que reescrever uma dependência do zero também é bastante caro. Além disso, trabalhei na Microsoft por 10 anos e sempre tivemos dependências de terceiros verificadas em nossa árvore de fontes.
Bill
33
@LloydSargent Ter "NEAR cópias" não é pior, é melhor , porque cada projeto tem uma dependência específica, que você definiu, e o restante do seu código depende. Se você tivesse as mesmas versões em vários projetos, em seguida, se você atualizar qualquer coisa que você deve atualizar tudo . As dependências de fixação permitem atualizações fragmentadas - substancialmente menos manutenção. Trabalho de verdade, projetos que não são de brinquedo.
18740 Dave
459

Eu tive um problema muito semelhante. Remover a node_modulespasta inteira e reinstalar funcionou para mim:

rm -rf node_modules
npm install
Abhinav Singh
fonte
13
Eu também faria um cache npm limpo, assim como uma coisa de segurança :)
Tony Tai Nguyen
1
Provavelmente um bom primeiro passo solução de problemas sempre que um problema de dependência estranho aparece que npm install/ npm updatenão vai resolver. Isso resolveu um problema em que era Error: Cannot find module 'http-errors'exibido aleatoriamente quando eu tentava executar meu aplicativo Express.
Matt Vukas
Incrível, a resposta de @ carelesslyChoosy resolveu uma dependência ausente. Parece que atualizar e desatualizar com a instalação do npm no local não mantém as coisas arrumadas.
enguia ghEEz
3
Uma etapa que falta aqui é remover o arquivo package-lock.json antes de executar npm install.
Rick Quantz
isso não funcionou para mim, até reiniciou o computador;)
Jason G
83
npm install --save module_name

Por exemplo, se o erro for:

{[Erro: Não foi possível encontrar o código do módulo '/root/.npm/form-data']: 'MODULE_NOT_FOUND'}

então você pode resolver esse problema executando o comando npm install --save form-data.

Piyush Chordia
fonte
1
parece que quando eu o instalei globalmente, a pasta npm / node-modules estava vazia e eu estava tentando usá- ng new project-namelo mostrando alguns módulos ausentes ... Eu tive que instalá-los cada um usando o comando fornecido. existe algum comando para instalar todos eles de uma só vez?
Vishal Nair
25

Para usuários TypeScript, se você estiver importando um módulo Nó interno (como http, pathou url) e recebendo um erro como o mesmo "Cannot find module "x", o erro pode ser corrigido executando

npm install @types/node --save-dev

O comando importará as definições do NodeJS TypeScript para o seu projeto, permitindo que você use os módulos internos do Node.

mgthomas99
fonte
18

Isso acontece quando uma primeira npm instalação do falha por algum motivo (SIGINT de npm) ou quando o atraso é muito longo ou os dados estão corrompidos. Tentar instalar o npm novamente não salvará o problema.

Ocorreu um erro na primeira verificação do npm, portanto, a melhor opção é remover o arquivo e reiniciar a instalação do npm.

Alex Werner
fonte
16
isso diagnosticou o problema para mim. Acabei fazendo npm cache cleare limpando node_modules seguido por npm installpara corrigir meu problema.
meklarian
9

Se você usar o nvm, verifique se node_modules existentes que são ligações a outras bibliotecas são compilados para a versão correta do Node.js.

Eu estava tendo o mesmo erro. O motivo foi o seguinte: Usamos o nvm, pois estamos executando dois aplicativos em um servidor, um requer o Node.js. 5.6 porque ele usa o node-gd (que não roda no Node.js. 6 por enquanto), o outro requer Node.js 6. O Node.js 6 é a instalação do apt-get .

Também usamos a ferramenta pm2 para implantar.

Portanto, a configuração padrão é que o processo pm2 seja iniciado quando o nvm não estiver em vigor, portanto, ele usa a instalação apt-get do Node.js. (versão 6). Portanto, o daemon pm2 principal inicia com o Node.js 6. Se eu executar aplicativos no modo de bifurcação, eles iniciarão em processos separados e as configurações de nvm entrarão em vigor. Quando executo aplicativos no modo de cluster - eles herdam o ambiente não-nvm.

Portanto, quando tentei alternar para o modo de cluster, o aplicativo falhou ao iniciar porque as ligações compiladas para 5.6 falharam com esta mensagem.

Eu consertei isso reiniciando o pm2 quando as configurações da nvm estão em vigor. Os scripts de inicialização também devem ser corrigidos.

Ilya Sheershoff
fonte
Como você verifica isso?
tamj0rd2
8

Verifique se a variável de ambiente NODE_PATH está configurada corretamente e apontando para o caminho node_modules. nodejs usa essa variável para procurar as bibliotecas

Edgar Chavolla
fonte
I upvoted isso, pois resolveu o meu problema imediato, e levou-me a esta documentação node.js . Mas acho que essa não é uma resposta geral, pois a documentação indica estratégias alternativas para a localização de módulos.
Graham Klyne
6

Ontem, ocorreu este erro. Demorei um pouco para perceber que a mainentrada package.jsonestava apontando para um arquivo que eu havia movido. Uma vez eu atualizei que o erro desapareceu e o pacote funcionou.

ukosteopath
fonte
2
Vaca sagrada ... por desespero, digitei "Erro: Não foi possível encontrar o módulo" no google e encontrei esta pergunta. Sua resposta resolveu meu problema. Não acredito que um termo de pesquisa tão vago tenha a resposta certa. Parabéns a você e ao Google!
Jamon Holmgren
1
Muito isso. Eu consegui apontar a mainentrada para o meu submódulo em um diretório que foi excluído de seu repositório; portanto, quando tentei incluí-lo por npm installele funcionava, mas nenhuma exportação foi encontrada quando necessário! Muito obrigado por esta resposta óbvia, mas útil.
Dragos
Obrigado por isso. Eu tive essa situação enquanto usava os espaços de trabalho do Yarn, então estava procurando em todo lugar algoritmos de resolução de caminho e todo tipo. :) Fiquei impressionado com a maneira como a mensagem de erro fala em 'localizar' o módulo, e também que o ESLint estava dando mensagens de erro semelhantes. E então eu vi sua resposta e percebi que eu era um idiota. Obrigado!
precisa saber é o seguinte
5

Remova sua node_modulepasta raiz do seu projeto (por exemplo myApp:). Vá para a myApppasta e digite o comando abaixo do terminal

>myApp>npm install

Ele instalará todos os módulos de dependência necessários para o seu projeto.

PrashanthiDevi
fonte
Você poderia elaborar mais sua resposta, adicionando um pouco mais de descrição sobre a solução que você fornece?
Abarisone
5

Este erro pode ser encontrado se você estiver requireusando um módulo que possui um maincampo ausente ou incorreto em seu package.json. Embora o próprio módulo esteja instalado, o npm / node precisa usar um único arquivo .js como um ponto de entrada para o seu módulo. Se o maincampo não estiver lá, o padrão será procurar index.jsna pasta do seu módulo. Se o arquivo principal do seu módulo não for chamado index.js, ele não poderárequire .

Descoberto ao transformar um browserifymódulo baseado em um requiremódulo compatível com CommonJS ; browserifynão se importava com o maincampo ausente e, portanto, o erro passou despercebido.

MrCranky
fonte
4

Especifique o caminho para a pasta restler, que estará dentro da pasta node_modules como: var rest = require ('./ node_modules / restler');

Isso funcionou para mim.

Srishti Singh
fonte
3

Se você estiver usando texto datilografado e obtendo um erro após instalar todos os módulos do nó, remova-o package-lock.json. E então corra npm install.

Kartik Garasia
fonte
2

DICA PRO:

Esse erro aconteceu comigo, enquanto lutava contra a fadiga e doenças leves, porque eu digitei em node blahvez de npm blah.

A mensagem de erro recebida não estava com raiva o suficiente para me alertar sobre minha própria loucura!

Dave
fonte
2

Eu enfrentei o mesmo problema quando alguém da equipe atualizou package.jsonno SVN. A simples remoção do node_modulesdiretório não ajudou. Como eu resolvi o problema é:

rm -rf node_modules
rm package.json
rm package-lock.json
svn up
npm install
ng build --env=prod

Espero que isso ajude alguém!

Soumya Kanti
fonte
Obrigado pela lembrança. No meu caso, foi o package-lock.json bagunçando as coisas novamente, mas após excluí-lo e node_modules, a execução de npm installtudo está bem novamente.
TaeKwonJoe 01/02/19
6
Se você remover package.jsoncomo o NPM sabe o que instalar?
Michał
1

Eu posso adicionar mais um lugar para verificar; o pacote que eu estava tentando usar era outro dos meus próprios pacotes que publiquei em um repositório particular do NPM. Eu tinha esquecido de configurar a propriedade 'main' no package.json corretamente. Portanto, o pacote estava lá na pasta node_modules do pacote consumidor, mas eu estava recebendo "não é possível encontrar o módulo". Levei alguns minutos para perceber meu erro. :-(

martinp999
fonte
1

No meu caso, eu estava UNMET PEER DEPENDENCY redux@^3.0.0causando essa mensagem de erro, veja todos eles e instale os módulos ausentes novamente usando --save

npm install redux --save
Ursu ​​Alexandr
fonte
1

Remover o nó / npm e reinstalar a versão estável (não a mais recente) funcionou para mim.

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

https://nodejs.org/en/download/
Kal
fonte
1

No Appsome Solutions , tivemos o mesmo problema com a configuração do nosso projeto de texto datilografado e o "moduleResolution": "node",resolvemos em um tsconfig.json.

Patryk Janik
fonte
0

Eu estava tentando publicar meu próprio pacote e incluí-lo em outro projeto. Eu tive esse problema por causa de como eu construí o primeiro módulo. Estou usando a exportação do ES2015 para criar o módulo, por exemplo, digamos que o módulo tenha a seguinte aparência:

export default function(who = 'world'){
    return `Hello ${who}`;
}

Depois de compilado com Babel e antes de ser publicado:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

Então, depois npm install module-nameem outro projeto (nenhum ES2015) eu tive que fazer

var hello = require('module-name').default;

Para realmente ter o pacote importado.

Espero que ajude!

Belgor
fonte
0

Foi encontrado esse problema ao usar webpackcom webpack-dev-middleware.

Transformara um único arquivo em uma pasta .

O observador parecia não ver a nova pasta e o módulo estava ausente.

Corrigido reiniciando o processo.

Chris
fonte
0

Acabei de encontrar um cenário incomum que pode ser útil para alguém e é uma espécie de arenque vermelho.

Eu também estava recebendo o erro Cannot Find Module, mas estranhamente tudo funcionou perfeitamente no meu ambiente Node.js. local (hospedado pelo Mac). Esse problema só apareceu quando o código foi implantado em nosso servidor Linux.

Bem ... acabou sendo um erro de digitação que (aparentemente) a instalação do Node.j com base em Mac estava perfeitamente feliz em ignorar.

O include era assim:

var S3Uploader = require('./S3Uploader.class');

Mas o arquivo real foi chamado "s3Uploader.class.js"

Observe a diferença de maiúsculas e minúsculas no 's' vs. 'S' entre o código e o nome do arquivo.

Portanto, na chance ímpar de que nenhuma das outras soluções aqui esteja resolvendo seu problema, verifique três vezes se você não está interpretando incorretamente os caracteres no nome do arquivo incluído! :)

e DUH!

Yevgeny Simkin
fonte
1
Por padrão OSX sistema de arquivos (HFS +) é caso insensível ... não descobriram há muito tempo, é definitivamente configurável embora
giulp
0

Talvez como eu, você defina 'view engine' expressamente em um mecanismo que não existe ou tente usar um mecanismo de modelo não registrado. Certifique-se de usar: app.engine('engine name',engine) app.set('view engine','engine name')

Mohammed Abo-zaid
fonte
0

Instale a nova CLI v3 (npm install -g ionic @ latest).

Se esse problema ainda for um problema na CLI v3. Obrigado!

Akash Limbani
fonte
0

Se o pacote instalado com êxito, vá para a pasta node_modules, verifique o arquivo e o caminho. Então importe. Espero que isto ajude.

Nasir Khan
fonte
-3

Antes de tudo, sim, uma parte da minha resposta definitivamente é útil para resolver o erro postado pelo OP. Em segundo lugar, depois de tentar a etapa abaixo, enfrentei alguns outros erros e, assim, escrevi a solução deles também.

(Psst! Não sei se ajudei a solucionar o erro acima com êxito ou se violei alguma regra ou formato de resposta, mas enfrentei o erro acima e alguns outros e demorei muito tempo para encontrar as soluções adequadas para esses erros. Estou escrevendo a solução completa porque, se outra pessoa também enfrentar esses erros, esperamos que ele obtenha uma solução aqui.)

Então, adicionando e elaborando a resposta fornecida por PrashanthiDevi , e também adicionando minha experiência pessoal, aqui está:

Eu sou novo em toda a parte e2e e testes de unidade. Comecei a analisar essa parte do transferidor . Agora eu já tinha os arquivos nos quais os testes foram gravados, mas tive que executar os testes.

Eu já tinha instalado todos os softwares e ferramentas necessários, mas quando executei o código para executar os testes, gulp itestrecebi o erro 'Não é possível encontrar o módulo' . Depois de passar por muitas perguntas diferentes sobre o SO, encontrei uma resposta que pensei que poderia ajudar a obter uma solução.

A pessoa sugeriu executar o comando npm installna minha pasta do projeto.

O motivo para fazer isso foi atualizar a pasta node-modules , dentro da pasta do projeto, com todos os arquivos e dependências necessários e necessários.

(A parte abaixo pode ser irrelevante para esta pergunta, mas pode ser útil se alguém se deparar com a mesma situação que eu enfrentei.)

O passo acima certamente resolveu meu erro anterior, mas lançou um novo! Desta vez, o erro está sendo Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

No entanto, a solução desse erro foi bem boba (e engraçada) para mim. Eu já tinha o arquivo chromedriver na minha pasta selênio . Mas acontece que o erro acima estava ocorrendo porque meus arquivos do chromedriver estavam dentro da pasta selenium e não dentro da pasta chromedriver . Então, criar uma pasta do chromedriver e copiar os arquivos do chromedriver resolveu o meu problema!

Além disso, pelo erro: Tempo limite esgotado, aguardando o servidor WebDriver , você pode adicionar esta linha de código ao arquivo conf.js. dentro exports.config{}:

seleniumAddress: 'http://localhost:8080/'

Espero que isto ajude!

HardikT
fonte
-4

Eu tenho a solução simples para resolver esse problema.

Basta remover C: \ Users \ UserName \ AppData \ Roaming \ npm \

e instale o nó.

Agora seu problema será resolvido.

Gangadhar
fonte
Ele está usando Unix. Não é o Windows.
Saif Al Falah
-4

Execute apenas o seguinte comando:

npm install

Ele instalará todos os módulos necessários na node_modulespasta.

mohsin139
fonte
-5
rm -rf node_modules
npm install
npm fund

isso funciona para mim.

AndriyFM
fonte
-38

Mude o diretório e aponte para a pasta do projeto atual e, em seguida, "npm install". .

Isso instalará todas as dependências e módulos na pasta do projeto.

emekaokoli
fonte
2
esta resposta não parece estar errada, sinto que a votação negativa é resultado de algum viés e apoio a comentários sarcásticos.
Muqsith
2
que muitos votos negativos são um pouco demais. Não é completamente vago. Está relacionado à resposta aceita. Toda a resposta diz é para fazer npm installno diretório correto. Não há nada de negativo nisso
shinobi