আমি কীভাবে নোড.জেজে "ত্রুটি: স্প্যান ENOENT" ডিবাগ করব?


349

যখন আমি নিম্নলিখিত ত্রুটিটি পাই:

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" ] )
জোশুয়া পিন্টার 15

উত্তর:


235

দ্রষ্টব্য: এই ত্রুটিটি প্রায়শই হ'ল কারণ কমান্ডটির অস্তিত্ব নেই, কারণ কার্যকরী ডিরেক্টরি বিদ্যমান নেই, বা উইন্ডোজ-কেবল বাগ থেকেই।

এর মূল কারণ সম্পর্কে ধারণা পেতে আমি একটি বিশেষ সহজ উপায় পেয়েছি:

Error: spawn ENOENT

এই ত্রুটিটির সমস্যাটি হ'ল, কল সাইটটি কোথায়, অর্থাত্ কোনটি এক্সিকিউটেবল / কমান্ড খুঁজে পাওয়া যায় না, তাত্ক্ষণিক ত্রুটি বার্তায় খুব কম তথ্য রয়েছে, বিশেষত যখন আপনার কাছে একটি বড় কোড বেস থাকে যেখানে প্রচুর স্প্যান কল থাকে । অন্যদিকে, আমরা যদি ত্রুটি সৃষ্টির সঠিক আদেশটি জানি তবে সমস্যাটি সমাধানের জন্য আমরা @ ল্যাঙ্কনবাসের উত্তর অনুসরণ করতে পারি ।

@ লাকানবাসের উত্তরের পরামর্শ অনুসারে আপনার কোডের সর্বত্র ইভেন্ট শ্রোতাদের যুক্ত করার পরিবর্তে কোন আদেশটি সমস্যার কারণ হতে পারে তা চিহ্নিত করার একটি খুব সহজ উপায় আমি পেয়েছি। মূল ধারণাটি হ'ল আসল স্প্যান কলটিকে একটি মোড়কের সাথে মোড়ানো যা স্প্যান কলটিতে প্রেরিত আর্গুমেন্টগুলি মুদ্রণ করে।

এখানে মোড়ক ফাংশনটি দেওয়া হয়েছে, এটিকে 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সঠিক উপায়ে বলা হয়

প্রথমে চাইল্ড_প্রসেস.স্প্যান (কমান্ড, আরগস, অপশনস) এর জন্য ডকগুলি পর্যালোচনা করুন :

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
এটি স্প্যান ENOENT এর আমার ডিবাগিংয়ে খুব সহায়ক হয়েছে। আমি একাধিকবার এটি রেফারেন্স করেছি। ধন্যবাদ!
কোডমানিয়াক

36
আমি এটিও খুঁজে পেয়েছি যে ENOENT নিক্ষেপ করা হবে যদি আপনি বিকল্পগুলিতে নির্দিষ্ট করে cwdথাকেন তবে প্রদত্ত ডিরেক্টরিটি বিদ্যমান নেই।
ড্যানিয়েল ইমফেল্ড

4
নিবন্ধন করুন আপনার এই উত্তরটি লিখতে হবে says
গ্রিনএজজেড

4
যখন আপনি ব্যবহার করছেন spawn('some-command', ['--help'], { env: env });হিসাবে এই উত্তরে ধাপ 3 দ্বারা exemplified এবং একটি কাস্টম পরিবেশ ক্ষণস্থায়ী হয়, উল্লেখ নিশ্চিত করা PATHউদাহরণস্বরূপ: { env: { PATH: process.env.PATH } }। Env বিকল্পটি ডিফল্টরূপে আপনার বর্তমান env থেকে পরিবর্তনশীল উত্তরাধিকারী হবে না।
এন্টি

5
আমি shell: trueস্প্যান বিকল্পগুলিতে গিয়ে আমার সমস্যাটি সমাধান করতে সক্ষম হয়েছি ।
নিকফথিম

35

@ ড্যানিয়েলআইমফেল্ড যেমন এটি নির্দেশ করেছেন , আপনি বিকল্পগুলিতে "সিডব্লুডি" নির্দিষ্ট করে থাকলে ENOENT নিক্ষেপ করা হবে তবে প্রদত্ত ডিরেক্টরিটি বিদ্যমান নেই।


1
সুতরাং একটি নির্দিষ্ট ডিরেক্টরি কমান্ড চালানো একটি উপায় আছে?
মিত্রো

উইন্ডোজ (7) এ দেখে মনে হচ্ছে cwd
আপনারও ড্রাইভ লেটারটি

29

উইন্ডোজ সমাধান: নোড-ক্রস-স্প্যানspawn দিয়ে প্রতিস্থাপন করুন । উদাহরণস্বরূপ আপনার অ্যাপ্লিকেশন.জেএস এর শুরুতে:

(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
"জেনারেল গাইড" সরবরাহের জন্য আমার উত্তরটি রিফ্যাক্টর করার বিষয়ে চিন্তাভাবনা করা, এবং সমস্যার প্রতিটি কারণের বিশদটি (সমস্যা নির্ভরতা, ভুল কল, ভুল পরিবেশ, ...) মিস করুন।
laconbass

2
এই উত্তরটি যে কেউ পছন্দ করেন, তারাও এই স্থানীয় বিকল্পটিতে আগ্রহী হতে পারেন: gist.github.com/ORESoftware/7bf225f0045b4649de6848f1ea5def4c
আলেকজান্ডার মিলস

1
ডাউনভোটেড কারণ আপনি যা করতে চান তা যদি শেল হয় তবে আপনার ব্যবহার করা child_process.execবা পাস shell: trueকরা উচিত spawn
givanse

@givanse না অগত্যা সত্য - আপনি কি আপনি ব্যবহার করতে চান শেল উপর নির্ভর করে zsh বা ব্যাশ বা FSH চালাতে চান হতে পারে, এবং আচরণ ভিন্ন হয়
আলেকজান্ডার মিলস

22

উইন্ডোজের ENOENT এর জন্য, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 এটিকে ঠিক করুন।

উদাহরণস্বরূপ স্প্যান ('এনএমপি', ['-v'], {স্টিডিও: 'উত্তরাধিকারী'}) এর সাথে প্রতিস্থাপন করুন:

  • সমস্ত নোড.জেএস সংস্করণের জন্য:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
  • নোড.জেএস 5.x এবং তার পরে:

    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

আমার ক্ষেত্রে, প্রয়োজনীয় নির্ভরশীল সিস্টেম সংস্থানগুলি ইনস্টল না হওয়ার কারণে আমি এই ত্রুটিটি ফেলেছিলাম।

আরও নির্দিষ্টভাবে, আমার কাছে নোডজেএস অ্যাপ রয়েছে যা ইমেজম্যাগিক ব্যবহার করছে। এনপিএম প্যাকেজ ইনস্টল থাকা সত্ত্বেও, মূল লিনাক্স ইমেজম্যাগিক ইনস্টল করা হয়নি। আমি ইমেজম্যাগিক ইনস্টল করতে একটি অ্যাপ্লিকেশন পেয়েছি এবং এর পরে সব দুর্দান্ত কাজ করেছে!


উইন্ডোজের পাশাপাশি ইমেজম্যাগিকও ইনস্টল করা দরকার? আমি উইন্ডোতে পরীক্ষা করছি এবং ত্রুটি
পাচ্ছি

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

বাহ এমন একটি সহজ সমাধান এবং এটি আমার পক্ষে কাজ করেছিল! সবার সমস্যার সমাধান হওয়া উচিত কিনা তা দেখার জন্য সবার আগে এই চেষ্টা করা উচিত।
নিক কে

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

উদাহরণস্বরূপ, এই ফাইলের নামটি টেস্ট.জেএস , সুতরাং এটি কেবল যে ফোল্ডারে রয়েছে তাতে চলে যান । আমার ক্ষেত্রে এটি পরীক্ষার ফোল্ডারটি এর মতো:

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

ডেবিয়ান লিনাক্স সিস্টেমের ভিএস কোড সম্পাদক থেকে নোড.জেএস প্রোগ্রামটি ডিবাগ করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছিলাম। আমি লক্ষ্য করেছি একই জিনিস উইন্ডোজ ঠিক আছে। এখানে প্রদত্ত সমাধানগুলি খুব বেশি কার্যকর ছিল না কারণ আমি কোনও "স্প্যান" কমান্ড লিখিনি। আপত্তিজনক কোডটি সম্ভবত মাইক্রোসফ্ট লিখেছিল এবং ভিএস কোড প্রোগ্রামের আড়ালে লুকিয়েছিল।

এরপরে আমি লক্ষ্য করেছি যে নোড.জেসকে উইন্ডোজে নোড বলা হয় তবে ডেবিয়ানে (এবং সম্ভবত উবুন্টুর মতো ডেবিয়ান-ভিত্তিক সিস্টেমে) এটিকে নোডেজ বলা হয়। সুতরাং আমি একটি উপনাম তৈরি করেছি - একটি রুট টার্মিনাল থেকে, আমি দৌড়ে

ln -s / usr / bin / nodejs / usr / স্থানীয় / বিন / নোড

এবং এটি সমস্যার সমাধান করে। একই বা অনুরূপ পদ্ধতিটি সম্ভবত এমন অন্যান্য ক্ষেত্রে কাজ করবে যেখানে আপনার নোড.জেসকে নোডেজ বলা হয় তবে আপনি এমন একটি প্রোগ্রাম চালাচ্ছেন যা এটি নোড, বা তদ্বিপরীত বলে প্রত্যাশা করে।


0

আপনি যদি উইন্ডোজ নোড.জেজে থাকেন তবে কোটগুলি পরিচালনা করার সময় আপনি কিছু মজার ব্যবসা করেন যা আপনাকে একটি কমান্ড জারি করতে পারে যা আপনি জানেন যে কনসোল থেকে কাজ করে, তবে নোডে চালিত হওয়ার পরে না। উদাহরণস্বরূপ নিম্নলিখিত কাজ করা উচিত :

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

কিন্তু ব্যর্থ। windowsVerbatimArgumentsউদ্ধৃতিগুলি / হ্যান্ডলগুলি পরিচালনা করার জন্য একটি চমত্কারভাবে অননুমোদিত বিকল্প রয়েছে যা কৌশলটি মনে করে, কেবল আপনার অপটিক্স অবজেক্টে নিম্নলিখিতটি যুক্ত করতে ভুলবেন না:

const opts = {
    windowsVerbatimArguments: true
};

এবং আপনার আদেশটি ব্যবসায়ের দিকে ফিরে আসা উচিত।

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

অ্যারের ভিতরে যুক্তিগুলি উদ্ধৃত করবেন না
লকনবাস

@ ল্যাকনবাস এই ধারণাটি প্রকাশের জন্য একটি স্পষ্টতই তুচ্ছ উদাহরণ এবং যাতে উদ্ধৃতিগুলি সরানো যেতে পারে। তবে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনার একেবারে আর্গুমেন্টগুলি উদ্ধৃত করতে হবে (উদাহরণস্বরূপ যদি আপনাকে কোনও যুক্তি পাস করতে হয় যা এর সাথে একটি স্থানের সাথে একটি পথ থাকে: "সি: \ প্রোগ্রাম ফাইলগুলি \ ..." )। আমি এটি এখানে পোস্ট করেছি কারণ যদিও এটি আপনার নির্দিষ্ট ত্রুটি মামলার কারণ নাও হতে পারে তবে আশা করা যায় যে উইন্ডোজে নোডের উদ্ধৃতি যেমন আমার মুখোমুখি হয়েছিল তার কারণে অন্য কেউ এই ক্রিপ্টিক ত্রুটিটি অনুভব করতে সহায়তা করবে।
জোয়েল বি

নোড.জেএস ইতিমধ্যে কিছু ব্ল্যাক ম্যাজিক করে এবং নিঃশব্দে "সঠিকভাবে" যুক্তি উদ্ধৃত করে। অ্যারের অভ্যন্তরে অকার্যকর যুক্তি দিয়ে আপনি উল্লেখ করেছেন এমন অনির্ধারিত বিকল্প ছাড়া আপনার উদাহরণটি কাজ করা উচিত।
laconbass

কেবল নিজের অভিজ্ঞতা যুক্ত করতে আমি নোড থেকে জাভা প্রক্রিয়া চালিয়ে যাচ্ছিলাম। এই ত্রুটিটি যুক্তির চেয়ে কমান্ডের চারপাশে উদ্ধৃতিগুলির কারণে ঘটেছিল happened কমান্ড পাথের ফাঁক দিয়ে পরীক্ষা করুন এবং এটি এখনও উদ্ধৃতি ছাড়াই কাজ করে
ট্রোনকসো

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

যদি আপনি একটি অ্যাপ্লিকেশন যার উৎস আপনি সংশোধন করতে পারবেন না এনভায়রনমেন্ট ভেরিয়েবল সঙ্গে এটি invoking বিবেচনা এই সমস্যা সম্মুখীন হয়েছেন NODE_DEBUGসেট child_process, যেমন NODE_DEBUG=child_process yarn test। এটি আপনাকে এমন তথ্য সরবরাহ করবে যে কমান্ড লাইনগুলি কোন ডিরেক্টরিতে অন্তর্ভুক্ত হয়েছে এবং সাধারণত শেষ বিবরণটি ব্যর্থতার কারণ।


0

যদিও এটি কিছু পরিবেশের জন্য পরিবেশের পথ বা অন্য কোনও সমস্যা হতে পারে তবে আমি উইন্ডোজ 10 এ ভিজ্যুয়াল স্টুডিও কোডের জন্য লেটেক্স ওয়ার্কশপ এক্সটেনশনটি ইনস্টল করেছি এবং পিডিএফ তৈরি / পূর্বরূপ দেখার চেষ্টা করার সময় এই ত্রুটিটি দেখেছি। প্রশাসক হিসাবে ভিএস কোড চালানো আমার সমস্যার সমাধান করেছে।


1
আবার, সম্পর্কিত কোনও পদ্ধতিতে ফাইল সিস্টেমের পথ করুন। এক্সটেনশনটি সম্ভবত অ্যাডমিনের অনুমতি ব্যতীত কোনও পথে পৌঁছাতে পারে না
ল্যাকনবাস

-1

উইন্ডোজ ৮ এর ক্ষেত্রে আমি একই ত্রুটি পেয়েছি issue সমস্যাটি হ'ল আপনার সিস্টেমের পথের পরিবেশের পরিবর্তনশীলটি অনুপস্থিত। আপনার সিস্টেমের PATH ভেরিয়েবলটিতে "সি: \ উইন্ডোজ \ System32।" মান যুক্ত করুন।


-2

যোগ C:\Windows\System32\করুনpath এনভায়রনমেন্ট ভেরিয়েবল।

ধাপ

  1. আমার কম্পিউটার এবং বৈশিষ্ট্যগুলিতে যান

  2. উন্নত সেটিংসে ক্লিক করুন

  3. তারপরে পরিবেশ পরিবর্তনশীলগুলিতে

  4. নির্বাচন করুন Pathএবং তারপরে সম্পাদনা ক্লিক করুন

  5. ইতিমধ্যে উপস্থিত না থাকলে নিম্নলিখিতটি আটকান: C:\Windows\System32\

  6. কমান্ড প্রম্পট বন্ধ করুন

  7. আপনি যে কমান্ডটি চালাতে চেয়েছিলেন তা চালান

উইন্ডোজ 8 এনভায়রনমেন্ট ভেরিয়েবলের স্ক্রিনশট


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.