Instalasi global NPM "tidak dapat menemukan modul"

206

Saya menulis modul yang saya publikasikan ke npm beberapa saat yang lalu (https://npmjs.org/package/wisp)

Jadi itu menginstal dengan baik dari baris perintah:

$ npm i -g wisp

Namun, ketika saya menjalankannya dari baris perintah, saya terus mendapatkan kesalahan yang optimis tidak diinstal:

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

Namun, saya telah menentukan dalam package.json sebagai ketergantungan:

{
  "name": "wisp",
  "author": "Brendan Scarvell <[email protected]>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

Adakah yang tahu apa yang harus dilakukan untuk menjalankan ini? Saya tahu ini ada hubungannya dengan bagian bin menambahkan executable ke bin dan node_modules dalam direktori yang kosong. Tidak tahu bagaimana mengatasinya.

Menztrual
sumber
apa yang terjadi jika Anda menginstal tanpa opsi -g?
vinayr
Itu menginstal folder node_modules di direktori saat ini yang memiliki gumpalan di dalamnya.
Menztrual
Aku tahu. Apakah Anda masih mendapatkan kesalahan?
vinayr
Ya. Jika saya mencoba menjalankan gumpalan setelah melakukan npm lokal saya gumpalan, masih mengembalikan kesalahan yang sama
Menztrual
Saya baru saja menginstal modul Anda. Ini bekerja dengan baik untuk saya. Di mana gumpalan Anda? Dalam kasus saya, saya berlari ./node_modules/wisp/wispyang berfungsi dengan baik.
vinayr

Jawaban:

370

Untuk orang lain yang mengalami ini, saya punya masalah ini karena saya npmmenginstal ke lokasi yang tidak ada di saya NODE_PATH.

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

NODE_PATH saya kosong, dan menjalankan npm install --global --verbose promised-iomenunjukkan bahwa itu menginstal ke /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]

Skrip saya gagal pada 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)

Saya mungkin menginstal node dan npm dari sumber menggunakan configure --prefix=/opt. Saya tidak tahu mengapa ini membuat mereka tidak dapat menemukan modul yang diinstal. Perbaikan untuk saat ini adalah dengan mengarahkan NODE_PATH di direktori yang benar:

export NODE_PATH=/opt/lib/node_modules

require('promised-io/promise')Sekarang saya berhasil.

Neek
sumber
10
tempat mengatur NODE_PATH ini ??
sandy
8
@sandy tempat Anda mengatur variabel lingkungan NODE_PATH tergantung pada sistem operasi Anda. Saya menggunakan rasa Linux, jadi saya biasa export NODE_PATH=...mengaturnya di shell lokal sehingga diekspor ke perintah yang dijalankan di shell itu. Untuk membuat perubahan tetap ada atau tersedia untuk semua shell, letakkan di. Profil atau yang serupa. Konsep ini secara keseluruhan sangat rumit bagi pemula, coba baca help.ubuntu.com/community/EnvironmentVariables . Untuk Windows, Anda ingin beralih ke Linux. OK, hanya bercanda. Coba computerhope.com/issues/ch000549.htm atau cari di google.
Neek
13
Untuk OSX Lion, berikut berfungsi untuk saya ... ekspor NODE_PATH = / usr / local / lib / node_modules Saya menggunakan 'cari node_modules' untuk melacak jalur yang benar.
k1eran
2
NODE_PATH juga berfungsi untuk WINDOWS. ini berakar pada modul simpul dapat diinstal baik secara lokal maupun global.
zinking
5
Jika Anda menginstal Node.js dengan Homebrew di Mac OS X: Jalankan open -a TextEdit ~/.bash_profiledi Terminal, kemudian tambahkan export NODE_PATH=/usr/local/lib/node_moduleske akhir file. Nyalakan kembali jendela terminal. Sekarang menjalankan echo $NODE_PATHharus mencetak /usr/local/lib/node_modules.
Pwdr
39

tambahkan ini ke awal prog (mac):

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

Cando Zhou
sumber
4
Adakah cara untuk melakukan itu dengan cara khusus non-os?
UpTheCreek
@UpTheCreek ini adalah cara khusus non-os. Ini kode JS, Anda hanya perlu menunjuk ke node_modules yang memiliki moduleyou cari
Adelin
@Adelin - Ini adalah solusi spesifik OS karena lokasi global node_modules adalah spesifik OS. Misalnya jika Anda mengembangkan di windows, dan menjalankan linux dalam produksi, maka ini bukan solusi yang bagus.
UpTheCreek
Itu mudah diatasi. Sebagai contoh, Anda dapat menyimpan jalur node dalam variabel env, misalnya, dan mengganti jalur hardcoded dengan os.environ.nodepath(sesuatu di sepanjang baris ini).
Adelin
macOS Mojave 10.14.6 memerlukan penambahan ekspor NODE_PATH = / usr / local / lib / node_modules / npm / node_modules ke ~ / bash_profile yang lebih bebas mesin karena kode .js asli tidak terpengaruh.
vwvan
16

Secara default node tidak mencari di dalam / usr / local / lib / node_module untuk memuat modul global. Lihat memuat modul dijelaskan di http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Jadi, Anda harus 1) menambahkan / usr / local / lib / node_module ke NODE_PATH dan ekspor atau 2) salin modul simpul yang diinstal ke / usr / local / lib / node. (Seperti yang dijelaskan dalam tautan untuk memuat modul modul akan mencari di jalur ini dan akan bekerja)

keserampangan
sumber
10

Untuk beberapa (seperti saya) yang tidak ada yang berhasil, coba ini:

brew cleanup
brew link node
brew uninstall node
brew install node

Semoga ini bisa membantu seseorang :)

Akan
sumber
9

Perbaikan generik berikut akan untuk setiap modul. Misalnya dengan request-promise.

Menggantikan

npm install request-promise --global

Dengan

npm install request-promise --cli

bekerja ( sumber ) dan juga untukglobals daninherits

Juga, coba atur variabel lingkungan

NODE_PATH=%AppData%\npm\node_modules
Mohammed Zameer
sumber
3

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

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"
pengguna1959076
sumber
Itu ada secara default. Untuk pengguna dimuat, tetapi saat dijalankan sebagai root bukan, oleh karena itu perlu dimasukkan dalam jalur pengguna root.
stamster
2

Untuk Windows, dari Nodejs tidak dapat menemukan modul yang diinstal pada Windows? apa yang berhasil untuk saya adalah menjalankan tautan npm seperti pada

npm link wisp
SORE
sumber
Sebuah kata hati-hati - saya melakukan ini tetapi kemudian tidak bisa menggunakan kode zip saya dengan AWS lambda. Saya harus membuat node_module dibuat secara lokal seperti pada npm install wisp --save(tanpa opsi -g)
PM
2

Untuk Pengguna Mac Sebaiknya gunakan instalasi manual:

Untuk meminimalkan kemungkinan kesalahan izin, Anda dapat mengonfigurasi npm untuk menggunakan direktori lain. Dalam contoh ini, itu akan menjadi direktori tersembunyi di folder rumah Anda.

  1. Cadangkan komputer Anda sebelum Anda mulai.

  2. Buat direktori untuk instalasi global:

    mkdir ~ / .npm-global

  3. Konfigurasikan npm untuk menggunakan jalur direktori baru:

    npm config atur awalan '~ / .npm-global'

  4. Buka atau buat file ~ / .profile dan tambahkan baris ini:

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

  5. Kembali ke baris perintah, perbarui variabel sistem Anda:

    sumber ~ /. profil

  6. Uji: Unduh paket secara global tanpa menggunakan sudo.

    npm instal -g jshint

Alih-alih langkah 2-4, Anda dapat menggunakan variabel ENV yang sesuai (mis. Jika Anda tidak ingin memodifikasi ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

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

Shivansh Rajpoot
sumber
1

Punya masalah yang sama pada salah satu server pengujian yang berjalan di Ubuntubawah root. Kemudian menciptakan pengguna baru menggunakan useradd -m myuserdan diinstal semuanya ( nvm, node, paket) sebagai myuser. Sekarang berfungsi dengan baik.

Dmitriy
sumber
1

Di windows jika Anda baru saja melakukan instalasi bersih dan Anda mendapatkan ini, Anda perlu membuang cache npm Anda di \ AppData \ Roaming

Dmitry
sumber
1

Dalam kasus saya keduanya nodedan npmberada di jalur yang sama ( /usr/bin). Itu NODE_PATHkosong, sehingga npmmenempatkan modul global ke /usr/lib/node_modulestempat require(...)berhasil menemukannya. Satu-satunya pengecualian adalah npmmodul, yang datang dengan paket nodejs. Karena saya menggunakan sistem 64 bit, itu dimasukkan ke dalam /usr/lib64/node_modules. Ini bukan tempat yang membutuhkan (...) pencarian jika ada NODE_PATHnode kosong dan dimulai /usr/bin. Jadi saya punya dua pilihan:

  • tautan /usr/lib64/node_modules/npmke/usr/lib/node_modules/npm
  • pindahkan modul dari /usr/lib/node_modules/*ke /usr/lib64/node_modules/dan aturNODE_PATH=/usr/lib64/node_modules

Keduanya bekerja. Saya menggunakan OpenSUSE 42.1 dan paket nodejs dari pembaruan repositori. Versi 4.4.5.

GT
sumber
1

Saya melakukan ini dengan cara sederhana ...

  1. Batalkan Pemasangan simpul dari panel kontrol [Windows 7]
  2. Instal simpul lagi
  3. Instal busur derajat npm install --global --verbose protractor
    Perbarui manajer driver web.

bekerja dengan baik untuk saya.

Semoga ini bisa membantu Anda ....

santhosh v
sumber
1

Saya mendapat kesalahan ini Error: Cannot find module 'number-is-nan' padahal modulnya benar-benar ada. Itu karena instalasi Node.js buruk / tidak lengkap.

Untuk Windows, seperti yang disarankan oleh jawaban lain, Anda memerlukan instalasi Node yang bersih :

  • Hapus instalan Node.js
  • Hapus dua folder npmdannpm_cache masukC:\Users\user\AppData\Roaming
  • Mulai ulang Windows dan instal Node.js
  • Jalankan npm initatau ( npm init --yesuntuk konfigurasi default )
  • Tetapkan variabel lingkungan Windows untuk NODE_PATH. Jalur ini adalah tempat paket Anda diinstal. Mungkin seperti ituNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Mulai konsol cmd baru dan npmakan berfungsi dengan baik

Catatan :

Coba poin terakhir sebelum menginstal ulang Node.js, ini bisa menghemat waktu dan menghindari untuk menginstal ulang semua paket Anda.

alain.janinm
sumber
1

Saya baru saja menemukan masalah pada axiosmodul ini. Kemudian saya mencoba ini: jalankan rm -rf node_modulesdan yarn. Dan itu berhasil.

Finedy
sumber
0

Saya memiliki kesalahan yang sama dengan OP, tetapi menggali log yang bisa saya lihat sh: node: command not found .

Ternyata program / usr / bin / node (symlink) tidak lagi diinstal dengan apt install nodejs. Simpuled /usr/bin/node' tonodejs, npm install -g @ angular / cli` berhasil.

Cara yang tepat untuk menginstal ini pada debian adalah apt install nodejs-legacy.

mike
sumber
0

Saya harus menambahkan C: \ Users \ {Username} \ AppData \ Roaming \ npm ke variabel env saya dan kemudian saya dapat menginstal barang.

Rainhider
sumber