Jak rozwiązać błąd „Nie można znaleźć modułu” za pomocą Node.js?

616

Po ściągnięciu modułu z GitHub i wykonaniu instrukcji, aby go zbudować, próbuję wciągnąć go do istniejącego projektu przy użyciu:

> npm install ../faye

Wygląda to na załatwienie sprawy:

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

Ale Node.js nie może znaleźć modułu:

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

Naprawdę chcę zrozumieć, co się tutaj dzieje, ale nie wiem, gdzie dalej szukać. Jakieś sugestie?

Dave Causey
źródło
8
node_modulesOczekuje się katalog znajdować się w katalogu głównym projektu alongisde app.jsw Twoim przypadku. Dlaczego ..użyłeś ścieżki instalacji npm?
Alex Wayne
1
Po zmianie „npm install ../faye” na „npm install ../faye/build”, działa zgodnie z oczekiwaniami. Nie wiem, jak to jest typowe, ale faye tworzy katalog kompilacji, kiedy jest budowany, i umieszcza tam kopię pliku package.json. npm nie narzeka na pakiet.json na poziomie głównym, ale odwołuje się do plików, które nie istnieją na tym poziomie.
Dave Causey
2
Rozwiązałem problem, ale tak naprawdę nie udało mi się rozwiązać mojego prawdziwego pytania dotyczącego sposobu rozwiązania tego problemu. Spróbuję wymyślić kilka sugestii dotyczących ulepszenia npm i / lub węzła, aby ułatwić początkującym uniknąć tej sytuacji.
Dave Causey
1
Przejdź przez ten link , możesz dowiedzieć się, gdzie dokładnie nie udaje się wyszukać twoich modułów.
Amol M. Kulkarni
1
Sprawdź pogodę, czy jesteś w tym samym folderze, w którym go zainstalowałeś? jeśli nie zainstalowałeś go globalnie.
Ashwani Panwar

Odpowiedzi:

513

Użycie npm installinstaluje moduł tylko w bieżącym katalogu (w podkatalogu o nazwie node_modules). Czy plik app.js znajduje się pod home/dave/src/server/? Jeśli nie i chcesz użyć modułu z dowolnego katalogu, musisz zainstalować go globalnie, używając npm install -g.

Zwykle instaluję większość pakietów lokalnie, aby były one rejestrowane wraz z kodem mojego projektu.

Aktualizacja (8/2019):

Obecnie możesz używać pliku package-lock.json , który jest generowany automatycznie, gdy npm modyfikuje katalog node_modules. Dlatego możesz pominąć sprawdzanie pakietów, ponieważ package-lock.jsonśledzi dokładne wersje modułów, których aktualnie używasz. Aby zainstalować pakiety package-lock.jsonzamiast package.jsonużywać polecenia npm ci.

Aktualizacja (3/2016):

Otrzymałem dużo odpowiedzi na moją odpowiedź, szczególnie, że sprawdzam pakiety, od których zależy mój kod. Kilka dni temu ktoś nie opublikował wszystkich swoich pakietów ( https://kodfabrik.com/journal/i-ve-just-liberated-my-modules ), które złamały React, Babel i prawie wszystko inne. Mamy nadzieję, że teraz jest jasne, że jeśli masz kod produkcyjny, nie możesz polegać na NPM, który faktycznie utrzymuje twoje zależności dla Ciebie.

Rachunek
źródło
264
„Zazwyczaj instaluję większość pakietów lokalnie, aby były one rejestrowane wraz z kodem mojego projektu”. Zazwyczaj lepiej jest sporządzić package.jsonlistę, na których modułach npm jesteś zależny i zignorować node_modulesfolder. Następnie po prostu npm installskonfiguruj po sklonowaniu repozytorium.
Alex Wayne
53
Oprócz package.jsonwymieniania zależności lubię przechowywać dobre kopie rzeczy, od których jestem zależny. Miejsce na dysku jest tanie i jeśli npm lub pakiet zniknie z npm, nadal będę mieć w pełni działający projekt w moim repozytorium.
Bill
165
Jako stary programista omal nie zadławiłem się, gdy przeczytałem „paradygmat” deweloperów Node, że „miejsce na dysku jest tanie”. Mam biblioteki, których używam. Pomysł, że mogę mieć 100 kopii (lub, co gorsza, kopii W POBLIŻU), wywołuje u mnie mdłości. Miejsce na dysku jest tanie, ale czas konserwacji jest drogi. Być może, jeśli wykonujesz jednorazowy projekt zabawki, konserwacja jest tania. Jednak w prawdziwej pracy konserwacja jest kosztowna i nie ma wpływu na koszt miejsca na dysku.
Lloyd Sargent
65
Naprawdę nie rozumiem tego ostatniego komentarza. Nikt nie mówi o posiadaniu 100 kopii dowolnego fragmentu kodu, tylko po to, aby mieć 1 kopię kodu, od której zależy twój projekt. Alternatywą jest posiadanie niefunkcjonalnego projektu, jeśli NPM lub zależność zniknie pewnego dnia. Myślę, że przepisanie zależności od zera jest również dość drogie. Nawiasem mówiąc, pracowałem w Microsoft przez 10 lat i zawsze mieliśmy sprawdzone zależności od zewnętrznych dostawców w naszym drzewie źródeł.
Bill
33
@LloydSargent Posiadanie „BLISKICH kopii” nie jest gorsze, jest lepsze , ponieważ każdy projekt ma określoną zależność, którą zdefiniowałeś, a reszta kodu polega na. Jeśli masz te same wersje w wielu projektach, jeśli coś zaktualizujesz , musisz zaktualizować wszystko . Zależności przypinania umożliwiają częściowe aktualizacje - znacznie mniej konserwacji. Prawdziwa praca, projekty inne niż zabawki.
Dave Newton,
459

Miałem bardzo podobny problem. Usunięcie całego node_modulesfolderu i ponowna instalacja działały dla mnie:

rm -rf node_modules
npm install
Abhinav Singh
źródło
13
Zrobiłbym też czyszczenie pamięci podręcznej npm, tak dla bezpieczeństwa :)
Tony Tai Nguyen
1
Prawdopodobnie to dobry pierwszy krok w rozwiązywaniu problemów, gdy dziwny problem zależność wyskakuje że npm install/ npm updatenie rozwiąże. Rozwiązało to problem Error: Cannot find module 'http-errors'polegający na tym, że losowo zaczął się wyświetlać, gdy próbowałem uruchomić aplikację Express.
Matt Vukas,
Niesamowite, @ niedbale Odpowiedź Cheosy'ego rozwiązała brakującą zależność. Wydaje się, że uaktualnianie i obniżanie wersji z zainstalowanym npm nie utrzymuje porządku.
węgorz ghEEz
3
Brakującym krokiem jest usunięcie pliku package-lock.json przed uruchomieniem npm install.
Rick Quantz
to mi nie zadziałało, nawet uruchomiłem ponownie komputer;)
Jason G
83
npm install --save module_name

Na przykład, jeśli błąd wynosi:

{[Błąd: nie można znaleźć modułu /root/.npm/form-data ”] kod:„ MODULE_NOT_FOUND ”}

możesz rozwiązać ten problem, wykonując polecenie npm install --save form-data.

Piyush Chordia
źródło
1
wygląda na to, że kiedy zainstalowałem go globalnie, folder npm / node-modules był pusty i próbowałem go użyć ng new project-name, pokazując brakujące moduły ... Musiałem zainstalować każdy z nich za pomocą podanego polecenia. Następnie rozwiązało to problem, ale jest istnieje jedno polecenie, aby zainstalować je wszystkie naraz?
Vishal Nair
25

Dla użytkowników maszynopis, jeśli importujesz wbudowany moduł Node (takich jak http, pathlub url) i otrzymujesz błąd taki jak "Cannot find module "x"wówczas błąd można naprawić, uruchamiając

npm install @types/node --save-dev

Polecenie zaimportuje definicje NodeJS TypeScript do projektu, umożliwiając korzystanie z wbudowanych modułów Node.

mgthomas99
źródło
18

Dzieje się tak, gdy pierwszy npm instalacja uległa awarii z jakiegoś powodu (SIGINT npm), opóźnienie jest zbyt długie lub dane są uszkodzone. Ponowna próba instalacji npm nie uratuje problemu.

Coś poszło nie tak podczas pierwszego sprawdzania npm, więc najlepszym wyborem jest usunięcie pliku i ponowne uruchomienie instalacji npm.

Alex Werner
źródło
16
zdiagnozowało to dla mnie problem. Skończyło się na zrobieniu npm cache cleari wyczyszczeniu modułów node_modules, a następnie npm installrozwiązaniu problemu.
meklarian
9

Jeśli używasz nvm, sprawdź, czy istniejące moduły node_binding, które są powiązaniami z innymi bibliotekami, zostały skompilowane dla poprawnej wersji Node.js.

Miałem ten sam błąd. Powód był następujący: używamy nvm, ponieważ uruchamiamy dwie aplikacje na serwerze, jedna wymaga Node.js 5.6, ponieważ używa node-gd (która na razie nie działa na Node.js 6), druga wymaga Node.js 6. Node.js 6 to instalacja apt-get .

Do wdrożenia używamy również narzędzia pm2.

Tak więc domyślna konfiguracja polega na tym, że proces pm2 uruchamia się, gdy nvm nie działa, więc używa instalacji apt-get Node.js (wersja 6). Tak więc główny demon pm2 zaczyna się od Node.js 6. Jeśli uruchamiam aplikacje w trybie rozwidlenia, uruchamiają się one w osobnych procesach i obowiązują ustawienia nvm. Gdy uruchamiam aplikacje w trybie klastra - dziedziczą one środowisko inne niż NVM.

Kiedy więc próbowałem przełączyć się w tryb klastra, aplikacja nie uruchomiła się, ponieważ powiązania skompilowane dla wersji 5.6 nie powiodły się z tym komunikatem.

Naprawiłem to przez ponowne uruchomienie pm2, gdy obowiązują ustawienia NVM. Również skrypty startowe powinny zostać naprawione.

Ilya Sheershoff
źródło
Jak to sprawdzasz?
tamj0rd2,
8

Sprawdź, czy zmienna środowiskowa NODE_PATH jest ustawiona poprawnie i wskazuje ścieżkę node_modules. nodejs używa tej zmiennej do wyszukiwania bibliotek

Edgar Chavolla
źródło
I upvoted tym, jak rozwiązać mój problem, natychmiastowe i doprowadził mnie do tego node.js dokumentacji . Myślę jednak, że nie jest to ogólna odpowiedź, ponieważ dokumentacja wskazuje alternatywne strategie lokalizowania modułów.
Graham Klyne,
6

Wczoraj wystąpił ten błąd. Chwilę zajęło mi zrozumienie, że mainwpis package.jsonwskazywał na plik, który przeniosłem. Raz zaktualizowałem, że błąd zniknął, a pakiet działał.

ukosteopath
źródło
2
Święta krowa ... z desperacji wpisałem w Google „Błąd: Nie mogę znaleźć modułu” i znalazłem to pytanie. Twoja odpowiedź naprawiła mój problem. Nie mogę uwierzyć, że tak niejasne wyszukiwane hasło znalazło właściwą odpowiedź. Uznanie dla Ciebie i dla Google!
Jamon Holmgren
1
Bardzo to. Udało mi się wskazać mainwpis dla mojego podmodułu w katalogu, który został wykluczony z jego repozytorium, więc kiedy próbowałem dołączyć go przez npm installto działało, ale nie było eksportu, gdy było to wymagane! Wielkie dzięki za tę oczywistą, ale przydatną odpowiedź.
Dragos
Dzięki za to. Miałem taką sytuację podczas korzystania z obszarów roboczych Yarn, więc szukałem wszędzie algorytmów rozwiązywania ścieżek i wszelkiego rodzaju. :) Zaskoczyło mnie to, że komunikat o błędzie mówi o „lokalizacji” modułu, a także, że ESLint dawał podobne komunikaty o błędach. A potem zobaczyłem twoją odpowiedź i zdałem sobie sprawę, że jestem tępakiem. Dzięki!
Mark Birbeck,
5

Usuń node_modulefolder główny z projektu (np myApp.:). Przejdź do myAppfolderu, a następnie wpisz poniżej polecenie z terminala

>myApp>npm install

Zainstaluje wszystkie moduły zależności wymagane dla twojego projektu.

PrashanthiDevi
źródło
Czy mógłby Pan uściślić swoją odpowiedź, dodając nieco więcej opisu oferowanego rozwiązania?
abarisone
5

Ten błąd można napotkać, jeśli tworzysz requiremoduł z brakującym lub niepoprawnym mainpolem w pliku package.json. Chociaż sam moduł jest zainstalowany, npm / node musi użyć pojedynczego pliku .js jako punktu wejścia do modułu. Jeśli mainpola nie ma, domyślnie szuka index.jsw folderze modułu. Jeśli główny plik modułu nie jest nazwy index.js, nie będzie w stanie tego zrobićrequire zrobić.

Odkryty podczas przekształcania browserifymodułu opartego na module CommonJS require; browserifynie przejmowałem się brakującym mainpolem, więc błąd zniknął niezauważony.

MrCranky
źródło
4

Podaj ścieżkę do folderu Restler, który będzie w folderze node_modules, na przykład: var rest = Require ('./odn_modules / restler');

To zadziałało dla mnie.

Srishti Singh
źródło
3

Jeśli używasz maszynopisu i pojawia się błąd po zainstalowaniu wszystkich modułów węzłów, usuń go package-lock.json. A potem biegnij npm install.

Kartik Garasia
źródło
2

WSKAZÓWKA PRO:

Ten błąd przydarzył mi się podczas walki ze zmęczeniem i łagodną chorobą, ponieważ pisałem node blahzamiast npm blah.

Otrzymany komunikat o błędzie nie był wystarczająco zły, aby ostrzec mnie o moim szaleństwie!

Dave
źródło
2

Napotkałem ten sam problem, gdy ktoś w zespole zaktualizował package.jsonSVN. Samo usunięcie node_moduleskatalogu nie pomogło. Jak rozwiązałem problem:

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

Mam nadzieję, że to komuś pomoże!

Soumya Kanti
źródło
Dzięki za przypomnienie. W moim przypadku pakiet-lock.json znowu coś zepsuł, ale po usunięciu go i module_węzła, to npm installwszystko znowu działa dobrze.
TaeKwonJoe
6
Jeśli usuniesz, package.jsonskąd NPM wie, co zainstalować?
Michał
1

Mogę dodać jeszcze jedno miejsce do sprawdzenia; Pakiet, którego próbowałem użyć, był kolejnym z moich własnych pakietów, które opublikowałem na prywatnym repozytorium NPM. Zapomniałem poprawnie skonfigurować właściwość „main” w pliku package.json. Tak więc pakiet był w folderze node_modules konsumującego pakietu, ale otrzymywałem komunikat „nie można znaleźć modułu”. Zajęło mi kilka minut, aby zdać sobie sprawę z mojej pomyłki. :-(

martinp999
źródło
1

W moim przypadku UNMET PEER DEPENDENCY redux@^3.0.0spowodowałem ten komunikat o błędzie, zobacz je wszystkie i ponownie zainstaluj brakujące moduły za pomocą opcji --save

npm install redux --save
Ursu ​​Alexandr
źródło
1

Usunięcie węzła / npm, a następnie ponowna instalacja stabilnej (nie najnowszej) wersji działało dla mnie.

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

https://nodejs.org/en/download/
Kal
źródło
1

W Appsome Solutions mieliśmy ten sam problem z konfiguracją naszego projektu maszynopisu i dodany "moduleResolution": "node",w tsconfig.json rozwiązał go.

Patryk Janik
źródło
0

Próbowałem opublikować własny pakiet, a następnie dołączyć go do innego projektu. Miałem ten problem z powodu tego, jak zbudowałem pierwszy moduł. Korzystam z eksportu ES2015, aby utworzyć moduł, np. Powiedzmy, że moduł wygląda tak:

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

Po skompilowaniu z Babelem i wcześniej opublikowanym:

'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;
};

Więc po npm install module-namekolejnym projekcie (brak ES2015) musiałem to zrobić

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

Aby faktycznie zaimportować pakiet.

Mam nadzieję, że to pomaga!

Belgor
źródło
0

Napotkano ten problem podczas korzystania webpackz webpack-dev-middleware.

Zamienił pojedynczy plik w folder .

Obserwator zdawał się nie widzieć nowego folderu, a modułu brakowało.

Naprawiono przez ponowne uruchomienie procesu.

Chris
źródło
0

Właśnie znalazłem niezwykły scenariusz, który może być komuś przydatny i jest rodzajem czerwonego śledzia.

Otrzymywałem również błąd Cannot Find Module, ale dziwnie wszystko działało idealnie w moim lokalnym (Node.js) środowisku (Mac). Ten problem pojawił się dopiero po wdrożeniu kodu na naszym serwerze Linux.

Cóż ... okazało się, że jest to literówka, która (najwyraźniej) oparta na Macu instalacja Node.js była całkowicie szczęśliwa zignorować.

Dołączenie wyglądało tak:

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

Ale rzeczywisty plik nazywał się „s3Uploader.class.js”

Zwróć uwagę na różnicę wielkości liter w „s” w porównaniu do „S” między kodem a nazwą pliku.

Więc - na dziwną szansę, że żadne z innych rozwiązań nie rozwiązuje twojego problemu, potrójnie sprawdź, czy nie źle wpisujesz znaki w dołączonej nazwie pliku! :)

i DUH!

Jewgienij Simkin
źródło
1
Domyślnie system plików osx (HFS +) nie rozróżnia wielkości liter ... odkryto go niedawno, ale zdecydowanie można go konfigurować
giulp,
0

Może tak jak ja ustawiłeś „view engine” w trybie ekspresowym na silnik, który nie istnieje, lub próbowałeś użyć niezarejestrowanego silnika szablonów. Upewnij się, że używasz: app.engine('engine name',engine) app.set('view engine','engine name')

Mohammed Abo-zaid
źródło
0

Zainstaluj nowy CLI v3 (npm install -g ionic @ latest).

Jeśli ten problem nadal występuje w CLI v3. Dziękuję Ci!

Akash Limbani
źródło
0

Jeśli pakiet został zainstalowany pomyślnie, przejdź do folderu node_modules, a następnie sprawdź plik i ścieżkę. Następnie zaimportuj. Mam nadzieję że to pomoże.

Nasir Khan
źródło
-3

Przede wszystkim tak, część mojej odpowiedzi zdecydowanie jest pomocna w rozwiązaniu błędu, który został opublikowany przez OP. Po drugie, po wypróbowaniu poniższego kroku, spotkałem się z kilkoma innymi błędami, dlatego też napisałem ich rozwiązanie.

(Psst! Nie jestem pewien, czy udało mi się pomóc w rozwiązaniu powyższego błędu, czy też złamałem jakąś zasadę lub format odpowiedzi, ale napotkałem powyższy błąd i kilka innych i znalezienie go zajęło mi dużo czasu właściwe rozwiązania dla tych błędów. Piszę kompletne rozwiązanie, ponieważ w przypadku, gdy ktoś inny również napotka te błędy, mam nadzieję, że znajdzie rozwiązanie tutaj.)

Więc dodając i opracowując odpowiedź udzieloną przez PrashanthiDevi , a także dodając moje osobiste doświadczenie, oto ona:

Jestem nowy w całej e2e i testach jednostkowych. Zacząłem patrzeć na tę część od Kątomierza . Teraz miałem już pliki, w których napisano testy, ale musiałem je uruchomić.

Zainstalowałem już wszystkie wymagane oprogramowanie i narzędzia, ale kiedy początkowo uruchomiłem kod do uruchomienia testów, gulp itestdostałem ten błąd „Nie można znaleźć modułu” . Po przejrzeniu wielu różnych pytań dotyczących SO znalazłem jedną odpowiedź, która moim zdaniem mogłaby pomóc w znalezieniu rozwiązania.

Osoba zasugerowała uruchomienie polecenia npm installw folderze mojego projektu.

Powód, aby robić to było zaktualizować węzła-modules folder wewnątrz naszego katalogu projektu, ze wszystkimi wymaganymi i niezbędnych plików i zależności.

(Poniższa część może być nieistotna z tym pytaniem, ale może być pomocna, jeśli ktoś natknie się na tę samą sytuację, z którą się spotkałem).

Powyższy krok z pewnością rozwiązał mój poprzedni błąd, ale rzucił nowy! Tym razem jest to błąd Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

Jednak rozwiązanie tego błędu było dla mnie dość głupie (i zabawne). Miałem już plik chromedriver w moim folderze selenu . Ale okazuje się, że powyższy błąd nadchodził, ponieważ moje pliki chromedriver znajdowały się w folderze selenu, a nie w folderze chromedriver . Tak więc utworzenie folderu chromedriver i skopiowanie tam plików chromedriver rozwiązało mój problem!

Ponadto w przypadku błędu: Przekroczono limit czasu oczekiwania na serwer WebDriver , możesz dodać ten wiersz kodu do pliku conf.js wewnątrz exports.config{}:

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

Mam nadzieję że to pomoże!

HardikT
źródło
-4

Mam proste rozwiązanie tego problemu.

Wystarczy usunąć C: \ Users \ UserName \ AppData \ Roaming \ npm \

a następnie zainstaluj węzeł.

Teraz twój problem zostanie rozwiązany.

Gangadhar
źródło
Używa Uniksa. Nie Windows.
Saif Al Falah
-4

Uruchom tylko następujące polecenie:

npm install

Zainstaluje wszystkie wymagane moduły w node_modulesfolderze.

mohsin139
źródło
-5
rm -rf node_modules
npm install
npm fund

to działa dla mnie.

AndriyFM
źródło
-38

Zmień katalog i wskaż bieżący folder projektu, a następnie „npm install”. .

Spowoduje to zainstalowanie wszystkich zależności i modułów w folderze projektu.

emekaokoli
źródło
2
ta odpowiedź nie wydaje się błędna, uważam, że negatywne głosowanie jest wynikiem uprzedzeń i poparcia sarkastycznych komentarzy.
Muqsith,
2
tyle głosów negatywnych to trochę za dużo. To nie jest całkowicie niejasne. Odnosi się do przyjętej odpowiedzi. Wszystko, co mówi, to zrobić npm installwe właściwym katalogu. Nie ma w tym nic negatywnego
shinobi,