मैं नोड पर "त्रुटि: स्पॉन एनोएंट" को डिबग कैसे करता हूं।


350

जब मुझे निम्नलिखित त्रुटि मिलती है:

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)

इसे ठीक करने के लिए मैं किस प्रक्रिया का पालन कर सकता हूं?

लेखक नोट : इस त्रुटि के साथ बहुत सारे मुद्दों ने मुझे भविष्य के संदर्भों के लिए इस प्रश्न को पोस्ट करने के लिए प्रोत्साहित किया।

संबंधित सवाल:


मेरे मामले में, मैं पूरे कमांड में एक स्ट्रिंग के रूप में गुजर रहा था जैसे आप execपहले तर्क के रूप में और दूसरे तर्क के लिए एक ऐरे के रूप में विकल्प में पास होने के बजाय करेंगे। जैसे मैं spawn( "adb logcat -c" )इसके बजाय कर रहा था spawn( "adb", [ "logcat", "-c" ] )
जोशुआ पिंटर

जवाबों:


235

नोट: यह त्रुटि लगभग हमेशा होती है क्योंकि कमांड मौजूद नहीं है, क्योंकि वर्किंग डायरेक्टरी मौजूद नहीं है, या केवल-विंडोज बग से।

मुझे मूल कारण का विचार करने के लिए एक विशेष आसान तरीका मिला:

Error: spawn ENOENT

इस त्रुटि की समस्या यह है कि त्रुटि संदेश में वास्तव में बहुत कम जानकारी है जो आपको बताती है कि कॉल साइट कहां है, अर्थात कौन सा निष्पादन योग्य / कमांड नहीं मिला है, खासकर जब आपके पास एक बड़ा कोड आधार है जहां बहुत सारे स्पॉन कॉल हैं । दूसरी ओर, यदि हम सटीक कमांड को जानते हैं जो त्रुटि का कारण है तो हम समस्या को ठीक करने के लिए @laconbass के उत्तर का अनुसरण कर सकते हैं ।

मुझे यह पता लगाने का एक बहुत ही आसान तरीका मिला कि आपके कोड में हर जगह इवेंट श्रोताओं को जोड़ने के बजाय कौन सी कमांड समस्या का कारण बनती है जैसा कि @laconbass के उत्तर में सुझाया गया है। मुख्य विचार मूल स्पॉन कॉल को एक रैपर के साथ लपेटना है जो स्पॉन कॉल पर भेजे गए तर्कों को प्रिंट करता है।

यहां रैपर फ़ंक्शन है, इसे index.jsअपने सर्वर के शुरुआती स्क्रिप्ट या उसके शीर्ष पर रखें ।

(function() {
    var childProcess = require("child_process");
    var oldSpawn = childProcess.spawn;
    function mySpawn() {
        console.log('spawn called');
        console.log(arguments);
        var result = oldSpawn.apply(this, arguments);
        return result;
    }
    childProcess.spawn = mySpawn;
})();

फिर अगली बार जब आप अपना एप्लिकेशन चलाते हैं, तो बिना किसी अपवाद के संदेश से पहले आपको कुछ ऐसा दिखाई देगा:

spawn called
{ '0': 'hg',
  '1': [],
  '2':
   { cwd: '/* omitted */',
     env: { IP: '0.0.0.0' },
     args: [] } }

इस तरह आप आसानी से जान सकते हैं कि वास्तव में किस कमांड को निष्पादित किया गया है और फिर आप पता लगा सकते हैं कि नोडजे समस्या को ठीक करने के लिए निष्पादन योग्य क्यों नहीं ढूंढ सकते हैं।


3
यहाँ एक और विचार है: बस बदलने spawn()के लिए exec()और फिर कोशिश करें। exec()आपको बताएगा कि उसने किस कमांड को चलाने की कोशिश की।
एडम मोनसेन

1
महत्वपूर्ण: संभव के रूप में मुख्य जेएस फ़ाइल की शुरुआत के करीब कोड को ऊपर रखना सुनिश्चित करें। यदि आप पहले अन्य मॉड्यूल लोड करते हैं, तो वे 'स्पॉन' फ़ंक्शन को हटा सकते हैं और यहां ओवरराइड को कभी नहीं बुलाया जाएगा।
डैन निसेनबाम

1
मुझे स्क्रिप्ट का उपयोग करने का कोई सौभाग्य नहीं है। यह बिल्कुल काम नहीं करता है।
newguy

तो आप इस विधि का उपयोग किसी ग्रन्ट फ़ाइल में कैसे करेंगे? मुझे यकीन नहीं है कि यह कहां रखा जाए।
फेलिक्स ईव

2
इसने मेरे लिए पूरी तरह से काम किया। मैं बस अपने gulpfile.js फ़ाइल के शीर्ष पर इसे डाल देता हूं, और बिंगो बांगो बोंगो, स्पॉन लॉगिंग!
यन्न दुरान

121

चरण 1: सुनिश्चित spawnकरना सही तरीका कहा जाता है

सबसे पहले, child_process.spawn (कमांड, आर्ग्स, विकल्प) के लिए डॉक्स की समीक्षा करें :

दिए गए commandकमांड लाइन तर्कों के साथ, एक नई प्रक्रिया शुरू करता है args। यदि छोड़ा गया है, तो argsखाली एरे में चूक।

तीसरे तर्क का उपयोग अतिरिक्त विकल्पों को निर्दिष्ट करने के लिए किया जाता है, जो इसके लिए चूक करता है:

{ cwd: undefined, env: process.env }

envपर्यावरण चर को निर्दिष्ट करने के लिए उपयोग करें जो नई प्रक्रिया को दिखाई देगा, डिफ़ॉल्ट है process.env

सुनिश्चित करें कि आप कोई कमांड लाइन तर्क नहीं डाल रहे हैं commandऔर पूरी spawnकॉल वैध है । अगले कदम के लिए आगे बढ़ें।

चरण 2: उस ईवेंट एमिटर की पहचान करें जो त्रुटि ईवेंट का उत्सर्जन करता है

प्रत्येक कॉल के लिए अपने स्रोत कोड पर खोजें spawn, या child_process.spawn, यानी

spawn('some-command', [ '--help' ]);

और 'त्रुटि' घटना के लिए एक घटना श्रोता देते हैं, तो आप सटीक घटना एमिटर है कि इसे 'अनहेल्ड' के रूप में फेंक रहे हैं। डिबगिंग के बाद, उस हैंडलर को हटाया जा सकता है।

spawn('some-command', [ '--help' ])
  .on('error', function( err ){ throw err })
;

निष्पादित करें और आपको फ़ाइल पथ और लाइन नंबर प्राप्त करना चाहिए जहां आपकी 'त्रुटि' श्रोता पंजीकृत थी। कुछ इस तरह:

/file/that/registers/the/error/listener.js:29
      throw err;
            ^
Error: spawn ENOENT
    at errnoException (child_process.js:1000:11)
    at Process.ChildProcess._handle.onexit (child_process.js:791:34)

यदि पहली दो पंक्तियाँ अभी भी हैं

events.js:72
        throw er; // Unhandled 'error' event

जब तक वे नहीं करते हैं तब तक इस कदम को फिर से करें। आपको अगले चरण पर जाने से पहले त्रुटि सुनने वाले श्रोता की पहचान करनी चाहिए।

चरण 3: सुनिश्चित करें कि पर्यावरण चर $PATHसेट किया गया है

दो संभावित परिदृश्य हैं:

  1. आप डिफ़ॉल्ट spawnव्यवहार पर भरोसा करते हैं, इसलिए चाइल्ड प्रोसेस का वातावरण वैसा ही होगा process.env
  2. आप तर्क पर एक envवस्तु पारित करने के spawnलिए optionsखोजबीन कर रहे हैं।

दोनों परिदृश्यों में, आपको PATHपर्यावरण ऑब्जेक्ट पर कुंजी का निरीक्षण करना होगा जो कि स्पॉन्ड चाइल्ड प्रक्रिया का उपयोग करेगी।

परिदृश्य 1 के लिए उदाहरण

// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);

परिदृश्य 2 के लिए उदाहरण

var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });

अनुपस्थिति PATH(यानी, यह undefined) त्रुटि spawnका उत्सर्जन करने का कारण होगाENOENT , क्योंकि commandजब तक यह निष्पादन योग्य फ़ाइल के लिए एक पूर्ण पथ नहीं है, तब तक किसी भी का पता लगाना संभव नहीं होगा ।

जब PATHसही ढंग से सेट हो जाए, तो अगले चरण पर जाएं। यह एक निर्देशिका, या निर्देशिकाओं की एक सूची होनी चाहिए। अंतिम मामला सामान्य है।

चरण 4: सुनिश्चित करें commandकि इसमें परिभाषित लोगों की एक निर्देशिका मौजूद हैPATH

ENOENTफ़ाइल नाम command(यानी, 'कुछ-कमांड') में कम से कम स्पॉन त्रुटि का उत्सर्जन कर सकता है , जो परिभाषित की गई कम से कम एक निर्देशिका में मौजूद नहीं है PATH

की सटीक जगह का पता लगाएं command। अधिकांश लिनक्स वितरण पर, यह एक टर्मिनल से whichकमांड के साथ किया जा सकता है । यह आपको निष्पादन योग्य फ़ाइल (जैसे ऊपर) के लिए पूर्ण पथ बताएगा, या यह बताएगा कि क्या नहीं मिला है।

उदाहरण उपयोग जो और इसके उत्पादन के लिए जब एक आदेश है पाया

> which some-command
some-command is /usr/bin/some-command

जब एक आदेश नहीं मिला है, जिसका और इसके उत्पादन का उदाहरण उपयोग

> which some-command
bash: type: some-command: not found

मिस-इंस्टॉल किए गए प्रोग्राम एक नहीं मिली कमांड के लिए सबसे आम कारण हैं । यदि आवश्यक हो तो प्रत्येक कमांड प्रलेखन का संदर्भ लें और इसे स्थापित करें।

जब कमांड एक साधारण स्क्रिप्ट फ़ाइल है, तो यह सुनिश्चित करें कि यह एक निर्देशिका से सुलभ है PATHयदि यह नहीं है, तो इसे एक में स्थानांतरित करें या इसके लिए एक लिंक बनाएं।

एक बार जब आप निर्धारित करते हैं कि PATHयह सही ढंग से निर्धारित है और इससे commandसुलभ है, तो आपको अपने बच्चे की प्रक्रिया को spawn ENOENTफेंकने के बिना स्पॉन करने में सक्षम होना चाहिए ।


1
स्पॉन एनोइंट के मेरे डिबगिंग के लिए यह बहुत मददगार रहा है। मैंने इसे कई बार संदर्भित किया है। धन्यवाद!
कोडमनीक

36
मैंने यह भी पाया है कि यदि आप cwdविकल्पों में निर्दिष्ट करते हैं तो ENOENT को फेंक दिया जाएगा , लेकिन दी गई निर्देशिका मौजूद नहीं है।
डैनियल इमफेल्ड

4
@ डैनियलफेल्ड कुल SAVIOR। आपको एक उत्तर लिखना चाहिए जो यह कहता है।
ग्रीनएजजादे

4
जब आप spawn('some-command', ['--help'], { env: env });इस उत्तर में चरण 3 द्वारा उदाहरण के रूप में उपयोग कर रहे हैं और एक कस्टम वातावरण पारित कर रहे हैं PATH, उदाहरण के लिए, इसे निर्दिष्ट करना सुनिश्चित करें { env: { PATH: process.env.PATH } }:। एनवी विकल्प डिफ़ॉल्ट रूप से आपके वर्तमान एनवी से चर का वारिस नहीं करेगा।
anty

5
मैं shell: trueस्पॉन विकल्पों को पारित करके अपनी समस्या को हल करने में सक्षम था ।
निकोफ्थाइम

35

जैसा कि @DanielImfeld ने बताया , यदि आप विकल्पों में "cwd" निर्दिष्ट करते हैं, तो ENOENT को फेंक दिया जाएगा, लेकिन दी गई निर्देशिका मौजूद नहीं है।


1
तो वहाँ एक विशिष्ट निर्देशिका कमांड में निष्पादित करने का एक तरीका है?
मित्रो

विंडोज (7) में ऐसा लगता है कि आपको ड्राइव लेटर को cwdपथ में शामिल करने की भी आवश्यकता है : 'c: / ...' और न सिर्फ '/ ...'
20

29

विंडोज समाधान: नोड-क्रॉस-स्पॉन केspawn साथ बदलें । उदाहरण के लिए अपने app.js की शुरुआत में इस तरह:

(function() {
    var childProcess = require("child_process");
    childProcess.spawn = require('cross-spawn');
})(); 

2
इसे छोड़कर काम किया गया एक ड्रॉप-इन, चाइल्ड_प्रोसेस की कोई आवश्यकता नहीं है। ठीक उसी तरह जैसे नोड का स्पॉन या स्पॉनस्यूनिक, इसलिए यह प्रतिस्थापन में एक गिरावट है। var spawn = require('cross-spawn'); // Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
बोगडान ट्रस्का

27

@ लैकोनबेस के जवाब ने मेरी मदद की और शायद सबसे सही है।

मैं यहाँ आया क्योंकि मैं गलत तरीके से स्पॉन का उपयोग कर रहा था। एक साधारण उदाहरण के रूप में:

यह गलत है:

const s = cp.spawn('npm install -D suman', [], {
    cwd: root
});

यह गलत है:

const s = cp.spawn('npm', ['install -D suman'], {
    cwd: root
});

यह सही है:

const s = cp.spawn('npm', ['install','-D','suman'], {
    cwd: root
});

हालाँकि, मैं इसे इस तरह से करने की सलाह देता हूँ:

const s = cp.spawn('bash');
s.stdin.end(`cd "${root}" && npm install -D suman`);
s.once('exit', code => {
   // exit
});

ऐसा इसलिए है क्योंकि तब cp.on('exit', fn)ईवेंट हमेशा आग लगाएगा, जब तक कि बैश स्थापित नहीं cp.on('error', fn)हो जाता है, अन्यथा, घटना पहले आग लग सकती है, अगर हम इसे पहले तरीके से उपयोग करते हैं, अगर हम सीधे 'एनपीएम' लॉन्च करते हैं।


1
एक "सामान्य गाइड" प्रदान करने के लिए मेरे जवाब को फिर से भरने पर विचार करना, और समस्या के प्रत्येक कारण का विवरण छोड़ना (मिस निर्भरता, गलत कॉल, गलत वातावरण, ...)।
23 अक्टूबर को लैकोनाबास

2
हर कोई जो इस उत्तर को पसंद करता है, वह इस मूल विकल्प में भी दिलचस्पी ले सकता है: gist.github.com/ORESoftware/7bf225f0045b4649de6848f1ea5def4c
अलेक्जेंडर मिल्स

1
Downvoted क्योंकि अगर तुम क्या करना चाहते हैं एक खोल है, तो आप का उपयोग करना चाहिए child_process.execया पारित shell: trueकरने के लिए spawn
गिवेंसे

@givanse जरूरी नहीं कि सच हो - आप zsh या bash या fsh चलाना चाहते हैं जो इस बात पर निर्भर करता है कि आप किस शेल का इस्तेमाल करना चाहते हैं, और व्यवहार भी अलग है
अलेक्जेंडर मिल्स

22

Windows पर ENOENT के लिए, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 इसे ठीक करें

उदाहरण के लिए स्पॉन ('npm', ['-v'], {stdio: 'inherit'}) को प्रतिस्थापित करें:

  • सभी node.js संस्करण के लिए:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
  • नोड के लिए 5.js और बाद में:

    spawn('npm', ['-v'], {stdio: 'inherit', shell: true})

1
ये संशोधन कहां करें?
दीलन

8
मुख्य भाग जोड़ रहा हैshell: true
टेड न्याबर्ग

19

जो कोई भी इस पर ठोकर खा सकता है, यदि अन्य सभी उत्तर मदद नहीं करते हैं और आप विंडोज पर हैं, तो जान लें कि वर्तमान में spawnविंडोज और PATHEXTपर्यावरण चर पर एक बड़ा मुद्दा है जो कुछ कॉल को पैदा करने के लिए स्पॉन पर काम नहीं कर सकता है। लक्ष्य कमांड स्थापित है।


2
और उपाय क्या है?
निलज़ोर

6
नोड-क्रॉस-स्पॉन का उपयोग करना मेरे लिए काम करता था। नीचे उत्तर देखें: stackoverflow.com/a/35561971/507339
Nilzor

1
जो कुछ गलत था, उसे खोजने की कोशिश में उम्र बीत गई और यह समस्या समाप्त हो गई। मैंने हार मान ली spawnऔर बस execइसके बजाय इस्तेमाल किया।
भुनाया गया

8

मेरे मामले में, यह निर्भरता आवश्यक सिस्टम संसाधनों को स्थापित नहीं किए जाने के कारण मुझे मिली।

विशेष रूप से, मेरे पास एक NodeJS ऐप है जो ImageMagick का उपयोग कर रहा है। एनपीएम पैकेज स्थापित होने के बावजूद, कोर लिनक्स इमेजमैग स्थापित नहीं किया गया था। मैंने ImageMagick को स्थापित करने के लिए एक एप्टीट्यूड प्राप्त किया और उसके बाद सभी ने शानदार काम किया!


क्या Windows की आवश्यकता है ImageMagick के रूप में अच्छी तरह से स्थापित? खिड़कियों पर Im परीक्षण और त्रुटि हो रही है
Somename

6

विंडोज़ में, बस shell: trueविकल्प जोड़ने से मेरी समस्या हल हो गई:

गलत:

const { spawn } = require('child_process');
const child = spawn('dir');

सही बात:

const { spawn } = require('child_process');
const child = spawn('dir', [], {shell: true});

5

क्या आप envविकल्प बदल रहे हैं ?

फिर इस उत्तर को देखो।


मैं एक नोड प्रक्रिया और टीआईएल स्पॉन करने की कोशिश कर रहा था कि आपको मौजूदा पर्यावरण चर को फैलाना चाहिए जब आप स्पॉन करते हैं तो आप PATHपर्यावरण चर और संभवतः अन्य महत्वपूर्ण वाले को ढीला कर देंगे ।

यह मेरे लिए फिक्स था:

const nodeProcess = spawn('node', ['--help'], {
  env: {
    // by default, spawn uses `process.env` for the value of `env`
    // you can _add_ to this behavior, by spreading `process.env`
    ...process.env,
    OTHER_ENV_VARIABLE: 'test',
  }
});

4

इससे पहले कि कोई भी इस समस्या को समाप्त करने में अधिक समय व्यतीत करे, अधिकांश समय इसे node_modulesसंकुल को हटाने और पुनः स्थापित करके हल किया जा सकता है।

स्थापित करने के लिए:

यदि एक तालाबंदी मौजूद है तो आप उपयोग कर सकते हैं

yarn install --frozen-lockfile

या

npm ci

respectivly। अगर नहीं तो

yarn install

या

npm i

वाह इतना आसान उपाय और यह मेरे लिए काम किया! सभी को यह देखने की कोशिश करनी चाहिए कि क्या यह समस्या हल करता है।
निक K

2

मैं उसी समस्या में भाग गया, लेकिन मुझे इसे ठीक करने का एक सरल तरीका मिला। spawn()यदि उपयोगकर्ता द्वारा प्रोग्राम को PATH में जोड़ा गया है तो यह त्रुटि प्रतीत होती है (जैसे सामान्य सिस्टम कमांड काम)।

इसे ठीक करने के लिए, आप किस मॉड्यूल का उपयोग कर सकते हैं ( npm install --save which):

// Require which and child_process
const which = require('which');
const spawn = require('child_process').spawn;
// Find npm in PATH
const npm = which.sync('npm');
// Execute
const noErrorSpawn = spawn(npm, ['install']);

2

require('child_process').execअधिक विशिष्ट त्रुटि संदेश के लिए स्पॉन के बजाय का उपयोग करें !

उदाहरण के लिए:

var exec = require('child_process').exec;
var commandStr = 'java -jar something.jar';

exec(commandStr, function(error, stdout, stderr) {
  if(error || stderr) console.log(error || stderr);
  else console.log(stdout);
});

1

सुनिश्चित करें कि निष्पादित मॉड्यूल स्थापित किया गया है या कमांड के लिए पूर्ण पथ है यदि यह नोड मॉड्यूल नहीं है


1

मैं अपने परीक्षण मामलों को चलाने के दौरान इस कष्टप्रद समस्या से गुज़र रहा था, इसलिए मैंने इसे पार करने के कई तरीके आज़माए। लेकिन जिस तरह से मेरे लिए काम करता है वह आपके परीक्षण धावक को निर्देशिका से चलाने के लिए होता है जिसमें आपकी मुख्य फ़ाइल होती है जिसमें आपका नोडज स्पॉन फ़ंक्शन शामिल होता है:

nodeProcess = spawn('node',params, {cwd: '../../node/', detached: true });

उदाहरण के लिए, इस फ़ाइल का नाम test.js है , इसलिए केवल उस फ़ोल्डर पर जाएं जिसमें यह है । मेरे मामले में, यह इस तरह से परीक्षण फ़ोल्डर है:

cd root/test/

तो मेरे मामले में अपने परीक्षण धावक चलाने से इसकी मोचा तो यह इस तरह होगा:

mocha test.js

मैंने इसका पता लगाने के लिए एक दिन से ज्यादा समय बर्बाद किया है। का आनंद लें!!


1

मैं विंडोज पर इस समस्या में भाग गया, जहां कॉलिंग execऔर spawnउसी कमांड (सटीक तर्क) के साथ ठीक काम किया exec(इसलिए मुझे पता था कि मेरी कमांड चालू थी $PATH), लेकिन spawnENOENT देगा। यह पता चला कि मुझे केवल .exeउस कमांड को संलग्न करने की आवश्यकता है जिसका मैं उपयोग कर रहा था:

import { exec, spawn } from 'child_process';

// This works fine
exec('p4 changes -s submitted');

// This gives the ENOENT error
spawn('p4');

// But this resolves it
spawn('p4.exe');
// Even works with the arguments now
spawn('p4.exe', ['changes', '-s', 'submitted']);

0

मुझे यह त्रुटि तब हो रही थी जब एक डेबियन लिनक्स सिस्टम पर VS कोड संपादक के भीतर से एक नोड.जेएस प्रोग्राम को डिबग करने की कोशिश की जा रही थी। मैंने देखा कि एक ही चीज ने विंडोज पर काम किया। पहले दिए गए समाधानों से बहुत मदद नहीं मिली क्योंकि मैंने कोई "स्पॉन" कमांड नहीं लिखा था। अपमानजनक कोड संभवतः Microsoft द्वारा लिखा गया था और वीएस कोड प्रोग्राम के हुड के नीचे छिपा हुआ था।

आगे मैंने देखा कि नोड.जेएस को विंडोज पर नोड कहा जाता है लेकिन डेबियन पर (और संभवतः डेबियन आधारित सिस्टम जैसे उबंटू पर) इसे नोडज कहा जाता है। इसलिए मैंने एक उपनाम बनाया - एक रूट टर्मिनल से, मैं भाग गया

ln -s / usr / bin / nodejs / usr / स्थानीय / बिन / नोड

और इससे समस्या हल हो गई। समान या इसी तरह की प्रक्रिया संभवतः अन्य मामलों में काम करेगी जहां आपके नोड.जेएस को नोडज कहा जाता है लेकिन आप एक कार्यक्रम चला रहे हैं जो उम्मीद करता है कि इसे नोड कहा जाएगा, या इसके विपरीत।


0

यदि आप Windows Node.js पर हैं, तो उद्धरणों को संभालते समय कुछ मज़ेदार व्यवसाय करते हैं, जिसके परिणामस्वरूप आप एक आदेश जारी कर सकते हैं जिसे आप जानते हैं कि यह कंसोल से काम करता है, लेकिन नोड में नहीं चलता है। उदाहरण के लिए निम्नलिखित कार्य करना चाहिए :

spawn('ping', ['"8.8.8.8"'], {});

लेकिन विफल रहता है। windowsVerbatimArgumentsउद्धरणों को संभालने के लिए एक विलक्षण रूप से अनिर्दिष्ट विकल्प है / जो चाल को करने के लिए लगता है, बस अपने ओपिनियन ऑब्जेक्ट में निम्नलिखित जोड़ना सुनिश्चित करें:

const opts = {
    windowsVerbatimArguments: true
};

और आपकी आज्ञा व्यवसाय में वापस होनी चाहिए।

 spawn('ping', ['"8.8.8.8"'], { windowsVerbatimArguments: true });

सरणी के अंदर के तर्क को उद्धृत न करें
लैकनबैस

@laconbass यह अवधारणा को व्यक्त करने के लिए एक स्पष्ट रूप से तुच्छ उदाहरण है और इसलिए उद्धरणों को हटाया जा सकता है। हालांकि, ऐसे मामले हैं जहां आपको तर्क को उद्धृत करने की आवश्यकता है (उदाहरण के लिए यदि आपको किसी तर्क को पारित करने की आवश्यकता है जिसमें इसमें एक जगह है: "C: \ Program Files \ ..." )। मैंने इसे यहां पोस्ट किया है, भले ही यह आपके विशिष्ट त्रुटि मामले का कारण नहीं हो सकता है, यह उम्मीद है कि किसी और को इस गुप्त त्रुटि का सामना करने में मदद करेगा क्योंकि नोड की विंडोज़ पर उद्धरणों की हैंडलिंग जैसे मैं सामना कर रहा था।
जोएल बी

नोड.जेएस पहले से ही कुछ ब्लैक मैजिक बनाता है और चुपचाप "ठीक से" तर्क देता है। आपके उदाहरण को आपके द्वारा उल्लेख किए गए अनजाने विकल्प के बिना काम करना चाहिए, सरणी के अंदर तर्क को अस्वीकार करके।
लैकोनाबास

बस अपने अनुभव को जोड़ने के लिए, मैं नोड से जावा प्रक्रिया चला रहा था। यह त्रुटि मुझे तर्क के बजाय आदेश के आसपास उद्धरणों के कारण हुई। कमांड पथ में रिक्त स्थान के साथ परीक्षण करें और यह अभी भी उद्धरण के बिना काम करता है
ट्रॉनकोसो

0

मेरे मामले में समाधान

var spawn = require('child_process').spawn;

const isWindows = /^win/.test(process.platform); 

spawn(isWindows ? 'twitter-proxy.cmd' : 'twitter-proxy');
spawn(isWindows ? 'http-server.cmd' : 'http-server');

1
हालांकि यह विशिष्ट सुधारों को जीतने के लिए एक समाधान हो सकता है, मैं नहीं देखता कि यह ENOENT के वास्तविक कारण को डिबग करने में कैसे मदद करता है
लैकोनबैस

मुझे पता नहीं क्यों, लेकिन स्पॉन कॉल नोड उत्तर के बिना काम करेगा .cmd, लेकिन टाइपस्क्रिप्ट जेस्ट टेस्ट में विफल। - यह त्रुटि पता लगाने में काफी कठिन हो सकती है, यह उत्तर अधिक उत्थान के योग्य है।
मैथ्यू CAROFF

0

मामले में आप एक आवेदन जिसका स्रोत आप संशोधित नहीं कर सकते वातावरण चर के साथ इसे लागू करने पर विचार के साथ यह समस्या हो रही NODE_DEBUGकरने के लिए सेट child_processहै, जैसे NODE_DEBUG=child_process yarn test। यह आपको यह जानकारी प्रदान करेगा कि कौन सी कमांड लाइनें किस निर्देशिका में लगाई गई हैं और आमतौर पर अंतिम विवरण विफलता का कारण है।


0

हालाँकि यह कुछ लोगों के लिए एक पर्यावरण पथ या एक और मुद्दा हो सकता है, मैंने अभी विंडोज 10 पर विज़ुअल स्टूडियो कोड के लिए लेटेक्स वर्कशॉप एक्सटेंशन स्थापित किया था और पीडीएफ को बनाने / पूर्वावलोकन करने का प्रयास करते समय यह त्रुटि देखी थी। प्रशासक के रूप में वीएस कोड चलाने से मेरे लिए समस्या हल हो गई।


1
फिर से, संबंधित फाइल सिस्टम कुछ रास्ता तय करते हैं। विस्तार शायद प्रशासन की अनुमति के बिना एक मार्ग तक नहीं पहुंच सकता है
लैकनेबास

-1

मुझे विंडोज़ 8 के लिए एक ही त्रुटि मिली। मुद्दा यह है कि आपके सिस्टम पथ के पर्यावरण चर गायब है। अपने सिस्टम पथ चर में "C: \ Windows \ System32 \" मान जोड़ें।


-2

जोड़े C:\Windows\System32\को pathवातावरण चर।

कदम

  1. मेरे कंप्यूटर और गुणों पर जाएं

  2. उन्नत सेटिंग्स पर क्लिक करें

  3. फिर पर्यावरण चर पर

  4. चयन करें Pathऔर फिर संपादन पर क्लिक करें

  5. निम्नलिखित को चिपकाएँ यदि पहले से मौजूद नहीं हैं: C:\Windows\System32\

  6. कमांड प्रॉम्प्ट को बंद करें

  7. वह कमांड चलाएं जिसे आप चलाना चाहते थे

विंडोज 8 पर्यावरण चर स्क्रीनशॉट


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.