Bagaimana cara mengatasi kesalahan "Tidak dapat menemukan modul" menggunakan Node.js?

616

Setelah menarik modul dari GitHub dan mengikuti instruksi untuk membuatnya, saya mencoba menariknya ke dalam proyek yang sudah ada menggunakan:

> npm install ../faye

Ini tampaknya berhasil:

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

Tetapi Node.js tidak dapat menemukan modul:

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

Saya benar-benar ingin memahami apa yang sedang terjadi di sini, tetapi saya agak bingung ke mana harus mencari berikutnya. Ada saran?

Dave Causey
sumber
8
The node_modulesdirektori diharapkan di root proyek Anda, alongisde app.jsdalam kasus Anda. Mengapa Anda menggunakan ..jalur instal npm?
Alex Wayne
1
Setelah mengubah "npm install ../faye" menjadi "npm install ../faye/build", ia berfungsi seperti yang diharapkan. Saya tidak tahu bagaimana tipikal ini, tetapi faye membuat direktori build ketika dibangun dan meletakkan salinan package.json di sana. npm tidak mengeluh tentang package.json di tingkat root, tetapi referensi file yang tidak ada di tingkat itu.
Dave Causey
2
Saya memecahkan masalah, tetapi tidak benar-benar mendapatkan resolusi untuk pertanyaan saya yang sebenarnya, yang merupakan cara untuk memecahkan masalah ini. Saya akan mencoba memunculkan beberapa saran untuk meningkatkan npm dan / atau node agar lebih mudah bagi pendatang baru untuk menghindari situasi ini.
Dave Causey
1
Pergi melalui Tautan ini , Anda mungkin mendapatkan beberapa gagasan seperti di mana tepatnya gagal untuk mencari modul Anda ..
Amol M Kulkarni
1
Periksa cuaca Anda berada di folder yang sama di mana Anda menginstalnya? jika Anda tidak menginstalnya secara global.
Ashwani Panwar

Jawaban:

513

Menggunakan npm installinstal modul ke direktori saat ini saja (dalam subdirektori disebut node_modules). Apakah app.js berada di bawah home/dave/src/server/? Jika tidak dan Anda ingin menggunakan modul dari direktori mana pun, Anda harus menginstalnya secara global npm install -g.

Saya biasanya menginstal sebagian besar paket secara lokal sehingga mereka diperiksa bersama dengan kode proyek saya.

Pembaruan (8/2019):

Saat ini Anda dapat menggunakan file package-lock.json , yang secara otomatis dihasilkan ketika npm memodifikasi direktori node_modules Anda. Karena itu Anda dapat meninggalkan memeriksa paket, karena package-lock.jsonmelacak versi yang tepat dari node_modules Anda, saat ini Anda gunakan. Untuk menginstal paket dari package-lock.jsonalih-alih package.jsonmenggunakan perintah npm ci.

Pembaruan (3/2016):

Saya telah menerima banyak kritik atas tanggapan saya, khususnya yang saya periksa dalam paket yang bergantung pada kode saya. Beberapa hari yang lalu, seseorang tidak menerbitkan semua paket mereka ( https://kodfabrik.com/journal/i-ve-just-liberated-my-modules ) yang melanggar React, Babel, dan hampir semua hal lainnya. Mudah-mudahan sudah jelas sekarang bahwa jika Anda memiliki kode produksi, Anda tidak dapat mengandalkan NPM untuk mempertahankan dependensi Anda.

Tagihan
sumber
264
"Saya biasanya menginstal sebagian besar paket secara lokal sehingga mereka diperiksa bersama dengan kode proyek saya." Biasanya lebih baik membuat package.jsondaftar modul npm yang Anda andalkan dan abaikan node_modulesfolder tersebut. Maka cukup npm installuntuk mendapatkan pengaturan setelah Anda mengkloning repo.
Alex Wayne
53
Selain package.jsondaftar dependensi, saya ingin menyimpan salinan yang baik dari hal-hal yang saya andalkan. Ruang disk murah dan jika npm atau paket menghilang dari npm, saya masih memiliki proyek yang berfungsi penuh di repo saya.
Bill
165
Sebagai pengembang lama saya hampir tersedak ketika saya membaca "paradigma" Node devs bahwa "ruang disk murah". Saya memiliki perpustakaan yang saya gunakan. Gagasan bahwa saya mungkin memiliki 100 salinan (atau lebih buruk, salinan DEKAT) membuat perut saya berubah. Ruang disk murah, tetapi waktu perawatannya mahal. Mungkin jika Anda melakukan proyek mainan satu kali, perawatannya murah. Namun, untuk pekerjaan nyata, perawatannya mahal dan tidak berpengaruh pada biaya ruang disk.
Lloyd Sargent
66
Saya benar-benar tidak mengerti komentar terakhir ini. Tidak ada yang mengatakan memiliki 100 salinan kode apa pun, hanya memiliki 1 salinan kode yang bergantung pada proyek Anda. Alternatifnya adalah memiliki proyek non-fungsional jika NPM atau ketergantungannya menghilang satu hari. Saya akan berpikir menulis ulang ketergantungan dari awal juga cukup mahal. Selain itu, saya bekerja di Microsoft selama 10 tahun dan kami selalu memeriksa dependensi pihak ke-3 ke sumber kami.
Bill
33
@LloydSargent Memiliki "DEKAT salinan" tidak lebih buruk, itu lebih baik , karena setiap proyek memiliki ketergantungan tertentu, yang telah Anda tetapkan, dan sisa kode Anda bergantung. Jika Anda memiliki versi yang sama di beberapa proyek maka jika Anda memperbarui sesuatu, Anda harus memperbarui semuanya . Mengaitkan dependensi memungkinkan peningkatan sedikit demi sedikit - jauh lebih sedikit perawatan. Pekerjaan nyata, proyek non-mainan.
Dave Newton
459

Saya memiliki masalah yang sangat mirip. Menghapus seluruh node_modulesfolder dan menginstal ulang berfungsi untuk saya:

rm -rf node_modules
npm install
Abhinav Singh
sumber
13
Saya juga akan melakukan pembersihan cache npm, sama seperti hal yang aman :)
Tony Tai Nguyen
1
Mungkin langkah pertama yang baik pemecahan masalah setiap kali masalah ketergantungan aneh muncul yang npm install/ npm updatetidak akan memecahkan. Ini memecahkan masalah di mana Error: Cannot find module 'http-errors'mulai muncul secara acak ketika saya mencoba menjalankan aplikasi Express saya.
Matt Vukas
Luar biasa, @ jawab carelesslyChoosy menyelesaikan ketergantungan yang hilang. Tampaknya meningkatkan dan menurunkan versi dengan npm menginstal di tempat tidak membuat segalanya rapi.
belut ghEEz
3
Langkah yang hilang di sini adalah menghapus file package-lock.json Anda sebelum dijalankan npm install.
Rick Quantz
ini tidak berhasil untuk saya, bahkan me-restart komputer;)
Jason G
83
npm install --save module_name

Misalnya, jika kesalahannya adalah:

{[Kesalahan: Tidak dapat menemukan kode modul '/root/.npm/form-data']: 'MODULE_NOT_FOUND'}

maka Anda dapat mengatasi masalah ini dengan menjalankan perintah npm install --save form-data.

Piyush Chordia
sumber
1
sepertinya ketika saya menginstalnya secara global folder npm / node-modules kosong dan saya mencoba menggunakannya ng new project-namemenunjukkan beberapa modul yang hilang ... Saya harus menginstalnya masing-masing menggunakan perintah yang diberikan. Kemudian ia menyelesaikan masalah tetapi ada satu perintah untuk menginstal semuanya sekaligus?
Vishal Nair
25

Untuk pengguna TypeScript, jika Anda mengimpor modul Node internal (seperti http, pathatau url) dan Anda mendapatkan kesalahan seperti itu "Cannot find module "x"maka kesalahan tersebut dapat diperbaiki dengan menjalankan

npm install @types/node --save-dev

Perintah akan mengimpor definisi NodeJS TypeScript ke proyek Anda, memungkinkan Anda untuk menggunakan modul bawaan NodeJS.

mgthomas99
sumber
18

Ini terjadi ketika instalasi npm pertama telah macet karena beberapa alasan (SIGINT dari npm), atau penundaannya terlalu lama, atau data rusak. Mencoba menginstal npm lagi tidak akan menyelamatkan masalah.

Ada yang salah pada pemeriksaan npm pertama, jadi pilihan terbaik adalah menghapus file dan memulai ulang instalasi npm.

Alex Werner
sumber
16
ini mendiagnosis masalah bagi saya. Saya akhirnya melakukan npm cache cleardan menghapus node_modules diikuti oleh npm installuntuk memperbaiki masalah saya.
meklarian
9

Jika Anda menggunakan nvm, periksa apakah node_modules yang ada yang mengikat ke perpustakaan lain dikompilasi untuk versi Node.js yang benar.

Saya mengalami kesalahan yang sama. Alasannya adalah sebagai berikut: Kami menggunakan nvm karena kami menjalankan dua aplikasi di server, satu memerlukan Node.js 5.6 karena menggunakan node-gd (yang tidak berjalan pada Node.js 6 untuk saat ini), yang lain memerlukan Node.js 6. Node.js 6 adalah instalasi apt-get .

Kami juga menggunakan alat PM2 untuk digunakan.

Jadi, pengaturan defaultnya adalah bahwa proses pm2 dimulai ketika nvm tidak berlaku, sehingga ia menggunakan instalasi apt-get dari Node.js (versi 6). Jadi daemon pm2 utama dimulai dengan Node.js 6. Jika saya menjalankan aplikasi dalam mode fork, mereka mulai dalam proses terpisah dan pengaturan nvm berlaku. Ketika saya menjalankan aplikasi dalam mode cluster - mereka mewarisi lingkungan non-nvm.

Jadi ketika saya mencoba untuk beralih ke mode cluster aplikasi gagal untuk memulai karena binding yang dikompilasi untuk 5.6 gagal dengan pesan ini.

Saya telah memperbaikinya dengan me-restart pm2 ketika pengaturan nvm berlaku. Skrip startup juga harus diperbaiki.

Ilya Sheershoff
sumber
Bagaimana Anda memeriksanya?
tamj0rd2
8

Periksa apakah variabel lingkungan NODE_PATH diatur dengan benar dan menunjuk ke jalur node_modules. nodejs menggunakan variabel ini untuk mencari perpustakaan

Edgar Chavolla
sumber
Saya memutakhirkan ini karena memecahkan masalah langsung saya, dan membawa saya ke dokumentasi node.js ini . Tapi saya pikir ini bukan jawaban yang pasti, karena dokumentasi menunjukkan strategi alternatif untuk menemukan modul.
Graham Klyne
6

Saya mengalami kesalahan ini kemarin. Butuh beberapa saat untuk menyadari bahwa mainentri masuk package.jsonmenunjuk ke file yang saya pindah. Setelah saya perbarui kesalahan itu hilang dan paketnya berfungsi.

ukosteopat
sumber
2
Astaga ... karena putus asa saya mengetik "Error: Tidak dapat menemukan modul" ke google, dan menemukan pertanyaan ini. Jawaban Anda memperbaiki masalah saya. Saya tidak percaya istilah pencarian yang tidak jelas seperti itu menghasilkan jawaban yang tepat. Kudos untuk Anda dan Google!
Jamon Holmgren
1
Sangat banyak ini. Saya telah berhasil mengarahkan mainentri untuk submodule saya di direktori yang dikecualikan dari repositori sehingga ketika saya mencoba untuk memasukkannya melalui npm installitu berfungsi, tetapi tidak ada ekspor yang ditemukan ketika diperlukan di! Terima kasih banyak atas jawaban yang jelas namun bermanfaat ini.
Dragos
Terima kasih untuk ini. Saya mengalami situasi ini saat menggunakan ruang kerja Benang, jadi mencari semua untuk algoritma resolusi jalur dan segala macam. :) Saya terlempar oleh cara pesan kesalahan berbicara tentang 'menemukan' modul, dan juga bahwa ESLint memberikan pesan kesalahan serupa. Dan kemudian saya melihat jawaban Anda dan menyadari bahwa saya adalah orang tolol. Terima kasih!
Mark Birbeck
5

Hapus node_modulefolder root Anda dari proyek Anda (misalnya:) myApp. Pergi ke myAppfolder dan kemudian ketik perintah di bawah ini dari terminal

>myApp>npm install

Ini akan menginstal semua modul dependensi yang diperlukan untuk proyek Anda.

PrashanthiDevi
sumber
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone
5

Kesalahan ini dapat ditemui jika Anda requiremenggunakan modul yang memiliki bidang yang hilang atau salah maindalam package.json. Meskipun modul itu sendiri diinstal, npm / node harus menggunakan file .js tunggal sebagai titik masuk ke modul Anda. Jika mainbidang tidak ada di sana, defaultnya adalah mencari index.jsdi folder modul Anda. Jika file utama modul Anda tidak disebut index.js, itu tidak akan bisa require.

Ditemukan saat mengubah browserifymodul berbasis-modul menjadi requiremodul CommonJS; browserifytidak peduli dengan mainbidang yang hilang , dan kesalahannya tidak diperhatikan.

MrCranky
sumber
4

Tentukan path ke folder restler, yang akan berada di dalam folder node_modules seperti: var rest = require ('./ node_modules / restler');

Ini berhasil untuk saya.

Srishti Singh
sumber
3

Jika Anda menggunakan naskah dan mendapatkan kesalahan setelah menginstal semua modul simpul kemudian hapus package-lock.json. Dan kemudian jalankan npm install.

Kartik Garasia
sumber
2

TIP PRO:

Kesalahan ini terjadi pada saya, saat berjuang melawan kelelahan dan penyakit ringan, karena saya mengetik node blahbukan npm blah.

Pesan kesalahan yang diterima tidak cukup marah untuk mengingatkan saya pada kebodohan saya sendiri!

Dave
sumber
2

Saya menghadapi masalah yang sama ketika orang lain dalam tim memperbarui package.jsondi SVN. Hanya menghapus node_modulesdirektori tidak membantu. Bagaimana saya memecahkan masalahnya adalah:

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

Semoga ini bisa membantu seseorang!

Soumya Kanti
sumber
Terima kasih atas pengingatnya. Dalam kasus saya itu adalah paket-lock.json mengacaukan semuanya lagi tetapi setelah menghapusnya dan node_modules kemudian menjalankan npm installsemuanya dengan baik lagi.
TaeKwonJoe
6
Jika Anda menghapus, package.jsonbagaimana NPM tahu apa yang harus dipasang?
Michał
1

Saya dapat menambahkan satu tempat lagi untuk memeriksa; paket yang saya coba gunakan adalah satu lagi paket saya sendiri yang telah saya publikasikan ke repo NPM pribadi. Saya lupa mengkonfigurasi properti 'utama' di package.json dengan benar. Jadi, paket itu ada di folder node_modules dari paket yang dikonsumsi, tetapi saya mendapatkan "tidak dapat menemukan modul". Butuh waktu beberapa menit untuk menyadari kesalahan saya. :-(

martinp999
sumber
1

Dalam kasus saya, saya telah UNMET PEER DEPENDENCY redux@^3.0.0menyebabkan pesan kesalahan ini, lihat semuanya dan pasang kembali modul yang hilang menggunakan --save

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

Menghapus node / npm dan menginstal ulang versi stabil (bukan yang terbaru) bekerja untuk saya.

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

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

Di Appsome Solutions, kami memiliki masalah yang sama dengan config proyek naskah dan ditambahkan "moduleResolution": "node",di tsconfig.json menyelesaikannya.

Patryk Janik
sumber
0

Saya mencoba untuk mempublikasikan paket saya sendiri dan kemudian memasukkannya ke dalam proyek lain. Saya punya masalah itu karena bagaimana saya membangun modul pertama. Saya menggunakan ekspor ES2015 untuk membuat modul, misalkan katakanlah modulnya terlihat seperti itu:

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

Setelah dikompilasi dengan Babel dan sebelum dipublikasikan:

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

Jadi setelah npm install module-namedi proyek lain (tidak ada ES2015) yang harus saya lakukan

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

Untuk benar-benar mendapatkan paket yang diimpor.

Semoga itu bisa membantu!

Belgor
sumber
0

Menemukan masalah ini saat menggunakan webpackdengan webpack-dev-middleware.

Telah mengubah satu file menjadi folder .

Pengamat sepertinya tidak melihat folder baru dan modul itu sekarang hilang.

Diperbaiki dengan memulai kembali proses.

Chris
sumber
0

Baru saja menemukan skenario yang tidak biasa yang mungkin berguna bagi seseorang dan semacam ikan haring merah.

Saya juga mendapatkan kesalahan Modul Tidak Dapat Menemukan tetapi anehnya semuanya bekerja dengan baik di lingkungan Node.js lokal saya (Mac yang dihosting). Masalah ini hanya muncul ketika kode digunakan di server Linux kami.

Yah ... itu ternyata salah ketik yang (tampaknya) instalasi Node.js berbasis Mac sangat senang diabaikan.

Termasuk tampak seperti ini:

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

Tetapi file yang sebenarnya disebut "s3Uploader.class.js"

Perhatikan perbedaan casing di 's' vs 'S' antara kode dan nama file.

Jadi - dalam kemungkinan aneh bahwa tidak ada solusi lain di sini yang menyelesaikan masalah Anda, periksa tiga kali lipat bahwa Anda tidak salah memasukkan karakter dalam nama file Anda yang disertakan! :)

dan DUH!

Yevgeny Simkin
sumber
1
Secara default osx filesystem (HFS +) tidak sensitif huruf ... ditemukan belum lama ini, pasti dapat dikonfigurasi
giulp
0

Mungkin seperti saya Anda mengatur 'view engine' secara ekspres ke mesin yang tidak ada, atau mencoba menggunakan mesin templating yang tidak terdaftar. Pastikan Anda menggunakan: app.engine('engine name',engine) app.set('view engine','engine name')

Mohammed Abo-zaid
sumber
0

Silakan instal CLI v3 baru (npm install -g ionic @ latest).

Jika masalah ini masih menjadi masalah di CLI v3. Terima kasih!

Akash Limbani
sumber
0

Jika paket berhasil diinstal pergi ke folder node_modules Anda kemudian periksa file dan path. Kemudian impor. Semoga ini membantu.

Nasir Khan
sumber
-3

Pertama-tama, ya, sebagian dari jawaban saya pasti sangat membantu untuk menyelesaikan kesalahan yang diposting oleh OP. Kedua, setelah mencoba langkah di bawah ini, saya menghadapi beberapa kesalahan lain, dan karenanya, telah menulis solusi untuk itu juga.

(Psst! Saya tidak yakin apakah saya telah berhasil membantu menyelesaikan kesalahan di atas, atau jika saya telah melanggar beberapa aturan atau format jawaban, tetapi saya menghadapi kesalahan di atas dan beberapa yang lain dan butuh banyak waktu bagi saya untuk menemukan solusi yang tepat untuk kesalahan-kesalahan itu. Saya sedang menulis solusi lengkap karena kalau-kalau ada orang lain yang juga menghadapi kesalahan ini, semoga dia akan mendapatkan solusi di sini.)

Jadi menambahkan, dan menguraikan jawaban yang diberikan oleh PrashanthiDevi , dan juga menambahkan pengalaman pribadi saya, ini dia:

Saya baru di seluruh bagian e2e dan unit test. Saya mulai melihat bagian ini dari busur derajat . Sekarang saya sudah memiliki file di mana tes ditulis, tetapi saya harus menjalankan tes.

Saya telah menginstal semua perangkat lunak dan alat yang diperlukan, tetapi ketika saya awalnya menjalankan kode untuk menjalankan tes gulp itest, saya mendapatkan kesalahan 'Tidak dapat menemukan modul' ini . Setelah melalui berbagai pertanyaan tentang SO, saya menemukan satu jawaban yang saya pikir dapat membantu mendapatkan solusi.

Orang itu menyarankan untuk menjalankan perintah npm installdi folder proyek saya.

The alasan untuk melakukan ini adalah untuk memperbarui simpul-modul folder, di dalam folder proyek kami, dengan semua file dan dependensi yang diperlukan dan yang diperlukan.

(Bagian di bawah ini mungkin tidak relevan dengan pertanyaan ini, tetapi mungkin bermanfaat jika ada yang menemukan situasi yang sama yang saya hadapi.)

Langkah di atas pasti memecahkan kesalahan saya sebelumnya, tetapi melemparkan yang baru! Kali ini kesalahannya adalah Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

Namun, solusi dari kesalahan ini cukup konyol (dan lucu) bagi saya. Saya sudah punya file chromedriver di folder selenium saya . Tapi, ternyata kesalahan di atas datang karena file chromedriver saya ada di dalam folder selenium dan tidak di dalam folder chromedriver . Jadi, membuat folder chromedriver dan menyalin file chromedriver di sana memecahkan masalah saya!

Juga, untuk kesalahan: Habis menunggu Server WebDriver , Anda bisa menambahkan baris kode ini ke file conf.js di dalam exports.config{}:

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

Semoga ini membantu!

HardikT
sumber
-4

Saya mendapat solusi sederhana untuk menyelesaikan masalah ini.

Hapus saja C: \ Users \ UserName \ AppData \ Roaming \ npm \

dan kemudian instal node.

Sekarang masalah Anda akan terpecahkan.

Gangadhar
sumber
Dia menggunakan Unix. Bukan Windows.
Saif Al Falah
-4

Jalankan hanya perintah berikut:

npm install

Ini akan menginstal semua modul yang diperlukan dalam node_modulesfolder.

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

itu bekerja untuk saya.

AndriyFM
sumber
-38

Ubah direktori dan arahkan ke folder proyek Anda saat ini dan kemudian "npm install". .

Ini akan menginstal semua dependensi dan modul ke folder proyek Anda.

emekaokoli
sumber
2
jawaban ini sepertinya tidak salah, saya merasa suara negatif adalah hasil dari beberapa bias dan mendukung komentar sarkastik.
Muqsith
2
bahwa banyak downvotes agak terlalu banyak. Tidak sepenuhnya kabur. Itu memang berhubungan dengan jawaban yang diterima. Semua jawaban mengatakan harus dilakukan npm installdi direktori yang benar. Tidak ada yang negatif tentang hal itu
shinobi