Ketika saya mendapatkan kesalahan berikut:
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
Prosedur apa yang bisa saya ikuti untuk memperbaikinya?
Catatan penulis : Banyak masalah dengan kesalahan ini mendorong saya untuk mengirim pertanyaan ini untuk referensi di masa mendatang.
Pertanyaan-pertanyaan Terkait:
- menggunakan fungsi spawn dengan NODE_ENV = produksi
- node.js child_process.spawn ENOENT error - hanya di bawah supervisord
- spawn ENOENT error node.js
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Node JS - child_process spawn ('npm install') dalam tugas Grunt menghasilkan kesalahan ENOENT
- Menjalankan tugas "mandor" Kesalahan fatal: menelurkan ENOENT
- unhandled error event di node js Kesalahan: menelurkan ENOENT di errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: kesalahan mengeksekusi hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Jalankan file exe dengan Child Process NodeJS
- Node: child_process.spawn tidak bekerja di Java meskipun sedang di jalur (ENOENT)
- spawn ENOENT error dengan NodeJS (terkait PYTHON)
- pengubahan ukuran gambar tidak berfungsi di node.js (partial.js) (dependensi tidak diinstal)
- npm instal error ENOENT (build dependency problem)
- Tidak dapat menginstal modul node.js - oracle di Windows 7 (masalah build dependency)
- Kesalahan menginstal gulp menggunakan nodejs di windows (kasus aneh)
node.js
debugging
error-handling
child-process
spawn
laconbass
sumber
sumber
exec
bukannya meneruskan perintah sebagai argumen pertama dan opsi sebagai Array untuk argumen kedua. misal sayaspawn( "adb logcat -c" )
malah melakukanspawn( "adb", [ "logcat", "-c" ] )
.Jawaban:
CATATAN: Kesalahan ini hampir selalu disebabkan karena perintah tidak ada, karena direktori kerja tidak ada, atau dari bug khusus windows.
Saya menemukan cara mudah tertentu untuk mendapatkan ide tentang penyebab utama:
Masalah dari kesalahan ini adalah, hanya ada sedikit informasi dalam pesan kesalahan untuk memberi tahu Anda di mana situs panggilan berada, yaitu yang dapat dieksekusi / perintah tidak ditemukan, terutama ketika Anda memiliki basis kode besar di mana ada banyak panggilan pemijahan . Di sisi lain, jika kita tahu perintah pasti yang menyebabkan kesalahan maka kita bisa mengikuti jawaban @laconbass untuk memperbaiki masalah.
Saya menemukan cara yang sangat mudah untuk menemukan perintah mana yang menyebabkan masalah daripada menambahkan pendengar acara di mana pun dalam kode Anda seperti yang disarankan dalam jawaban @laconbass. Gagasan utamanya adalah untuk membungkus panggilan spawn asli dengan pembungkus yang mencetak argumen yang dikirim ke spawn call.
Inilah fungsi wrapper, letakkan di bagian atas
index.js
atau apa pun skrip awal server Anda.Kemudian saat berikutnya Anda menjalankan aplikasi Anda, sebelum pesan pengecualian yang tidak tertangkap, Anda akan melihat sesuatu seperti itu:
Dengan cara ini Anda dapat dengan mudah mengetahui perintah mana yang benar-benar dieksekusi dan kemudian Anda dapat mengetahui mengapa nodejs tidak dapat menemukan yang dapat dieksekusi untuk memperbaiki masalah.
sumber
spawn()
keexec()
dan coba lagi.exec()
akan memberi tahu Anda perintah apa yang coba dijalankan.Langkah 1: Pastikan
spawn
disebut dengan cara yang benarPertama, tinjau dokumen untuk child_process.spawn (perintah, args, opsi) :
Pastikan Anda tidak memasukkan argumen baris perintah apa pun
command
dan seluruhspawn
panggilan itu valid . Lanjutkan ke langkah selanjutnya.Langkah 2: Identifikasi Emitor Peristiwa yang memancarkan peristiwa kesalahan
Cari pada kode sumber Anda untuk setiap panggilan ke
spawn
, atauchild_process.spawn
, yaitudan lampirkan di sana pendengar acara untuk acara 'kesalahan', sehingga Anda dapat mengetahui Peristiwa Emitor yang tepat yang melemparkannya sebagai 'Tidak Ditangani'. Setelah debugging, pawang itu dapat dihapus.
Jalankan dan Anda harus mendapatkan jalur file dan nomor baris tempat pendaftar 'kesalahan' Anda terdaftar. Sesuatu seperti:
Jika dua baris pertama masih
lakukan langkah ini lagi sampai tidak. Anda harus mengidentifikasi pendengar yang memancarkan kesalahan sebelum melanjutkan ke langkah berikutnya.
Langkah 3: Pastikan variabel lingkungan
$PATH
diaturAda dua skenario yang mungkin:
spawn
perilaku default , sehingga lingkungan proses anak akan sama denganprocess.env
.env
objek untukspawn
dioptions
argumen.Dalam kedua skenario, Anda harus memeriksa
PATH
kunci pada objek lingkungan yang akan digunakan proses anak yang dilahirkan.Contoh untuk skenario 1
Contoh untuk skenario 2
Tidak adanya
PATH
(yaitu, ituundefined
) akan menyebabkanspawn
memancarkanENOENT
kesalahan , karena itu tidak akan mungkin untuk menemukan apa puncommand
kecuali itu adalah jalur absolut ke file yang dapat dieksekusi.Ketika
PATH
diatur dengan benar, lanjutkan ke langkah berikutnya. Itu harus berupa direktori, atau daftar direktori. Kasus terakhir adalah biasa.Langkah 4: Pastikan
command
ada di direktori yang ditentukan dalamPATH
Bibit dapat memancarkan
ENOENT
kesalahan jika nama filecommand
(yaitu, 'beberapa perintah') tidak ada di setidaknya satu direktori yang ditentukanPATH
.Temukan tempat yang tepat dari
command
. Pada kebanyakan distribusi linux, ini dapat dilakukan dari terminal denganwhich
perintah. Ini akan memberi tahu Anda jalur absolut ke file yang dapat dieksekusi (seperti di atas), atau memberi tahu jika itu tidak ditemukan.Contoh penggunaan yang mana dan hasilnya ketika suatu perintah ditemukan
Contoh penggunaan yang mana dan hasilnya ketika suatu perintah tidak ditemukan
program yang salah pasang adalah penyebab paling umum untuk perintah yang tidak ditemukan .Lihat setiap dokumentasi perintah jika perlu dan pasang.
Ketika perintah adalah file skrip sederhana memastikan itu dapat diakses dari direktori di
PATH
. Jika tidak, pindahkan ke salah satu atau buat tautan ke sana.Setelah Anda menentukan
PATH
diatur dengan benar dancommand
dapat diakses dari itu, Anda harus dapat menelurkan proses anak Anda tanpaspawn ENOENT
dilemparkan.sumber
cwd
dalam opsi, tetapi direktori yang diberikan tidak ada.spawn('some-command', ['--help'], { env: env });
seperti yang dicontohkan oleh Langkah 3 dalam jawaban ini dan melewati lingkungan kustom, pastikan untuk menentukanPATH
, misalnya:{ env: { PATH: process.env.PATH } }
. Opsi env tidak akan mewarisi variabel dari env Anda saat ini secara default.shell: true
opsi spawn.Seperti yang ditunjukkan oleh @DanielImfeld , ENOENT akan dilemparkan jika Anda menentukan "cwd" pada opsi, tetapi direktori yang diberikan tidak ada.
sumber
cwd
jalur: 'c: / ...' dan bukan hanya '/ ...'Solusi Windows: Ganti
spawn
dengan node-cross-spawn . Misalnya seperti ini di awal app.js Anda:sumber
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
Jawaban @ laconbass membantu saya dan mungkin paling benar.
Saya datang ke sini karena saya salah menggunakan spawn. Sebagai contoh sederhana:
ini salah:
ini salah:
ini benar:
namun, saya sarankan melakukannya dengan cara ini:
ini karena
cp.on('exit', fn)
nanti acara akan selalu menyala, selama bash diinstal, jika tidak,cp.on('error', fn)
acara tersebut akan diaktifkan terlebih dahulu, jika kita menggunakannya dengan cara pertama, jika kita meluncurkan 'npm' secara langsung.sumber
child_process.exec
atau lulusshell: true
untukspawn
.Untuk ENOENT di Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 memperbaikinya.
mis. ganti spawn ('npm', ['-v'], {stdio: 'inherit'}) dengan:
untuk semua versi node.js:
untuk node.js 5.x dan yang lebih baru:
sumber
shell: true
Bagi siapa pun yang mungkin menemukan ini, jika semua jawaban lain tidak membantu dan Anda berada di Windows, ketahuilah bahwa saat ini ada masalah besar dengan
spawn
Windows danPATHEXT
variabel lingkungan yang dapat menyebabkan panggilan tertentu untuk muncul tidak berfungsi tergantung pada seberapa perintah target diinstal.sumber
spawn
dan hanya digunakanexec
sebagai gantinya.Dalam kasus saya, saya mendapatkan kesalahan ini karena sumber daya sistem dependen yang diperlukan tidak diinstal.
Lebih khusus lagi, saya memiliki aplikasi NodeJS yang menggunakan ImageMagick. Meskipun memiliki paket npm yang diinstal, inti Linux ImageMagick tidak diinstal. Saya melakukan apt-get untuk menginstal ImageMagick dan setelah itu semua bekerja dengan baik!
sumber
di windows, cukup menambahkan
shell: true
opsi menyelesaikan masalah saya:salah:
benar:
sumber
Apakah Anda mengubah
env
opsi?Kemudian lihat jawaban ini.
Saya mencoba untuk menelurkan proses simpul dan TIL bahwa Anda harus menyebarkan variabel lingkungan yang ada ketika Anda menelurkan lagi Anda akan kehilangan
PATH
variabel lingkungan dan mungkin yang penting lainnya.Ini adalah perbaikan untuk saya:
sumber
Sebelum siapa pun menghabiskan banyak waktu untuk debugging masalah ini, sebagian besar waktu itu dapat diatasi dengan menghapus
node_modules
dan menginstal ulang paket.Untuk memasang:
Jika ada file kunci yang mungkin Anda gunakan
atau
dengan hormat. jika tidak maka
atau
sumber
Saya mengalami masalah yang sama, tetapi saya menemukan cara sederhana untuk memperbaikinya. Tampaknya ada
spawn()
kesalahan jika program telah ditambahkan ke PATH oleh pengguna (mis. Perintah sistem normal berfungsi).Untuk memperbaiki ini, Anda dapat menggunakan modul yang mana (
npm install --save which
):sumber
Gunakan
require('child_process').exec
alih-alih menelurkan untuk pesan kesalahan yang lebih spesifik!sebagai contoh:
sumber
Pastikan modul yang akan dieksekusi dipasang atau path lengkap ke perintah jika bukan modul simpul
sumber
Saya juga mengalami masalah yang menjengkelkan ini saat menjalankan test case saya, jadi saya mencoba banyak cara untuk mengatasinya. Tetapi cara kerjanya bagi saya adalah dengan menjalankan test runner Anda dari direktori yang berisi file utama Anda yang mencakup fungsi nodejs Anda menelurkan sesuatu seperti ini:
Misalnya, nama file ini adalah test.js , jadi pindah saja ke folder yang berisi itu . Dalam kasus saya, ini adalah folder tes seperti ini:
maka dari menjalankan uji pelari Anda dalam kasus saya moka sehingga akan menjadi seperti ini:
Saya telah menghabiskan lebih dari satu hari untuk mencari tahu. Nikmati!!
sumber
Saya mengalami masalah ini pada Windows, di mana memanggil
exec
danspawn
dengan perintah yang sama persis (menghilangkan argumen) bekerja dengan baik untukexec
(jadi saya tahu perintah saya aktif$PATH
), tetapispawn
akan memberikan ENOENT. Ternyata saya hanya perlu menambahkan.exe
perintah yang saya gunakan:sumber
Saya mendapatkan kesalahan ini ketika mencoba men-debug program node.js dari dalam editor VS Code pada sistem Linux Debian. Saya perhatikan hal yang sama berfungsi dengan baik pada Windows. Solusi yang sebelumnya diberikan di sini tidak banyak membantu karena saya belum menulis perintah "spawn". Kode yang menyinggung itu kemungkinan ditulis oleh Microsoft dan disembunyikan di bawah kap program VS Code.
Selanjutnya saya perhatikan bahwa node.js disebut node pada Windows tetapi pada Debian (dan mungkin pada sistem berbasis Debian seperti Ubuntu) itu disebut nodejs. Jadi saya membuat alias - dari terminal root, saya berlari
ln -s / usr / bin / nodejs / usr / local / bin / node
dan ini memecahkan masalah. Prosedur yang sama atau serupa mungkin akan bekerja dalam kasus lain di mana node.js Anda disebut nodejs tetapi Anda menjalankan program yang mengharapkannya disebut node, atau sebaliknya.
sumber
Jika Anda menggunakan Windows Node.js melakukan beberapa bisnis lucu ketika menangani kutipan yang dapat mengakibatkan Anda mengeluarkan perintah yang Anda tahu berfungsi dari konsol, tetapi tidak ketika dijalankan di Node. Misalnya, yang berikut ini harus berfungsi:
tetapi gagal. Ada opsi yang tidak berdokumen fantastis
windowsVerbatimArguments
untuk menangani kutipan / serupa yang tampaknya melakukan trik, pastikan untuk menambahkan berikut ini ke objek opts Anda:dan perintah Anda harus kembali berbisnis.
sumber
solusi dalam kasus saya
sumber
.cmd
, tetapi gagal dalam tes jest mengetik naskah. - Kesalahan ini bisa sangat sulit untuk dipecahkan, jawaban ini pantas mendapatkan lebih banyak suara.Jika Anda mengalami masalah ini dengan aplikasi yang sumbernya tidak dapat Anda modifikasi, pertimbangkan untuk menggunakannya dengan variabel lingkungan yang
NODE_DEBUG
disetelchild_process
, misalnyaNODE_DEBUG=child_process yarn test
. Ini akan memberi Anda informasi yang baris perintah telah dipanggil di direktori mana dan biasanya detail terakhir adalah alasan kegagalan.sumber
Meskipun mungkin merupakan lintasan lingkungan atau masalah lain bagi sebagian orang, saya baru saja menginstal ekstensi Workshop Lateks untuk Visual Studio Code pada Windows 10 dan melihat kesalahan ini ketika mencoba membangun / melihat PDF. Menjalankan VS Code ketika Administrator memecahkan masalah untuk saya.
sumber
Saya mendapat kesalahan yang sama untuk windows 8. Masalahnya adalah karena variabel lingkungan dari jalur sistem Anda hilang. Tambahkan nilai "C: \ Windows \ System32 \" ke variabel PATH sistem Anda.
sumber
Tambahkan
C:\Windows\System32\
kepath
variabel lingkungan.Langkah
Buka komputer dan properti saya
Klik pada Pengaturan lanjutan
Kemudian pada variabel Lingkungan
Pilih
Path
dan kemudian klik editRekatkan yang berikut jika belum ada:
C:\Windows\System32\
Tutup prompt perintah
Jalankan perintah yang ingin Anda jalankan
sumber