ฉันจะดีบัก“ ข้อผิดพลาด: วางไข่ ENOENT” บน node.js ได้อย่างไร


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แทนที่จะส่งผ่านคำสั่งเป็นอาร์กิวเมนต์แรกและตัวเลือกเป็น Array สำหรับอาร์กิวเมนต์ที่สอง เช่นผมทำแทนspawn( "adb logcat -c" ) spawn( "adb", [ "logcat", "-c" ] )
Joshua Pinter

คำตอบ:


235

หมายเหตุ: ข้อผิดพลาดนี้เกิดขึ้นเกือบทุกครั้งเนื่องจากไม่มีคำสั่งอยู่เนื่องจากไม่มีไดเรกทอรีการทำงานอยู่หรือจากบั๊กเฉพาะ Windows

ฉันพบวิธีง่ายๆในการทำความเข้าใจสาเหตุของ:

Error: spawn ENOENT

ปัญหาของข้อผิดพลาดนี้คือมีข้อมูลน้อยมากในข้อความแสดงข้อผิดพลาดเพื่อแจ้งให้คุณทราบว่าไซต์การโทรคืออะไรซึ่งไม่สามารถเรียกใช้งานได้ / คำสั่งโดยเฉพาะอย่างยิ่งเมื่อคุณมีฐานรหัสขนาดใหญ่ที่มีการวางไข่จำนวนมาก . ในทางกลับกันถ้าเรารู้คำสั่งที่แน่นอนที่ทำให้เกิดข้อผิดพลาดเราสามารถทำตาม@laconbass 'คำตอบเพื่อแก้ไขปัญหา

ฉันพบวิธีที่ง่ายมากในการระบุคำสั่งที่ทำให้เกิดปัญหาแทนที่จะเพิ่มตัวฟังเหตุการณ์ในรหัสของคุณตามคำแนะนำใน @laconbass แนวคิดหลักคือการตัดการวางไข่ดั้งเดิมด้วย wrapper ซึ่งพิมพ์อาร์กิวเมนต์ที่ส่งไปยังการวางไข่

นี่คือฟังก์ชั่น wrapper วางไว้ที่ด้านบนสุด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: [] } }

ด้วยวิธีนี้คุณสามารถรู้ได้ง่ายว่าคำสั่งใดที่ถูกเรียกใช้จริงและจากนั้นคุณสามารถค้นหาสาเหตุที่ nodejs ไม่สามารถค้นหาไฟล์ที่เรียกทำงานได้เพื่อแก้ไขปัญหา


3
นี่คือความคิดอื่น: เพียงแค่เปลี่ยนspawn()ไปexec()และลองอีกครั้ง exec()จะบอกให้คุณทราบว่าคำสั่งใดที่พยายามเรียกใช้
Adam Monsen

1
สำคัญ: ตรวจสอบให้แน่ใจว่าวางรหัสด้านบนใกล้กับจุดเริ่มต้นของไฟล์ JS หลักเท่าที่จะทำได้ หากคุณโหลดโมดูลอื่นก่อนพวกเขาสามารถซ่อนฟังก์ชัน 'วางไข่' และการแทนที่ที่นี่จะไม่ถูกเรียกใช้
Dan Nissenbaum

1
ฉันไม่มีโชคในการใช้สคริปต์ มันไม่ทำงานเลย
newguy

ดังนั้นคุณจะใช้วิธีนี้ในไฟล์เสี้ยงฮึดฮัดไม่ได้อย่างไร ฉันไม่แน่ใจว่าจะนำสิ่งนี้ไปที่ไหน
เฟลิกซ์อีฟ

2
มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ฉันเพิ่งวางนี้ที่ด้านบนของไฟล์ gulpfile.js ของฉันและ bingo bango bongo, การวางไข่บันทึก!
Yann Duran

122

ขั้นตอนที่ 1: รับรองspawnว่าถูกต้องแล้ว

ก่อนอื่นให้ตรวจสอบเอกสารสำหรับ child_process.spawn (คำสั่ง args และตัวเลือก) :

เปิดตัวเป็นกระบวนการใหม่ที่มีให้กับอาร์กิวเมนต์บรรทัดคำสั่งในcommand argsหากเว้นไว้ให้ใช้argsค่าเริ่มต้นเป็น Array ที่ว่างเปล่า

อาร์กิวเมนต์ที่สามใช้เพื่อระบุตัวเลือกเพิ่มเติมซึ่งเป็นค่าเริ่มต้นไปที่:

{ cwd: undefined, env: process.env }

ใช้เพื่อระบุตัวแปรสภาพแวดล้อมที่จะมองเห็นได้ด้วยกระบวนการใหม่เริ่มต้นคือenvprocess.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. คุณพึ่งพาเริ่มต้นพฤติกรรมเพื่อให้สภาพแวดล้อมกระบวนการเด็กจะเป็นเช่นเดียวกับspawnprocess.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(เช่น 'some-command') ไม่มีอยู่ในไดเรกทอรีที่กำหนดไว้อย่างน้อยหนึ่งPATHรายการ

commandค้นหาสถานที่ที่แน่นอนของ บน linux distributions ส่วนใหญ่สามารถทำได้จากเทอร์มินัลด้วยwhichคำสั่ง มันจะบอกคุณเส้นทางที่แน่นอนไปยังไฟล์ปฏิบัติการ (เช่นด้านบน) หรือบอกว่ามันไม่พบ

ตัวอย่างการใช้งานซึ่งและเอาท์พุทเมื่อพบคำสั่ง

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

ตัวอย่างการใช้งานซึ่งและเอาท์พุทเมื่อไม่พบคำสั่ง

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

โปรแกรมที่พลาดการติดตั้งเป็นสาเหตุที่พบบ่อยที่สุดสำหรับคำสั่งnot found อ้างถึงเอกสารคำสั่งแต่ละคำสั่งหากจำเป็นและติดตั้ง

PATHเมื่อคำสั่งเป็นไฟล์สคริปต์ง่ายให้แน่ใจว่าจะสามารถเข้าถึงได้จากไดเรกทอรีบนที่ หากไม่ใช่ให้ย้ายไปที่ลิงก์ใดลิงก์หนึ่งหรือสร้างลิงก์ไปยังลิงก์นั้น

เมื่อคุณกำหนดPATHอย่างถูกต้องและcommandสามารถเข้าถึงได้จากนั้นคุณควรจะสามารถวางกระบวนการลูกของคุณโดยไม่spawn ENOENTถูกโยน


1
สิ่งนี้มีประโยชน์มากสำหรับการแก้ไขข้อบกพร่องของวางไข่ ENOENT ฉันเคยอ้างอิงหลายครั้ง ขอบคุณ!
CodeManiak

36
ฉันยังพบว่า ENOENT จะถูกโยนหากคุณระบุcwdในตัวเลือก แต่ไดเรกทอรีที่กำหนดไม่มีอยู่
Daniel Imfeld

4
@DanielImfeld ผู้แสดงทั้งหมด คุณควรเขียนคำตอบที่บอกสิ่งนี้
GreenAsJade

4
เมื่อคุณใช้spawn('some-command', ['--help'], { env: env });เป็นตัวอย่างโดยขั้นตอนที่ 3 ในคำตอบนี้และผ่านสภาพแวดล้อมที่กำหนดเองให้แน่ใจว่าได้ระบุPATHตัวอย่างเช่น: { env: { PATH: process.env.PATH } }. ตัวเลือก env จะไม่สืบทอดตัวแปรจาก env ปัจจุบันของคุณตามค่าเริ่มต้น
แอนตี้

5
ฉันสามารถแก้ไขปัญหาของฉันได้โดยส่งผ่านshell: trueตัวเลือกการวางไข่
Nickofthyme

35

ดังที่@DanielImfeld ชี้ไปแล้ว ENOENT จะถูกโยนทิ้งหากคุณระบุ "cwd" ในตัวเลือก แต่ไม่มีไดเรกทอรีที่ระบุ


1
ดังนั้นมีวิธีการดำเนินการในไดเรกทอรีเฉพาะคำสั่งหรือไม่
Mitro

ใน Windows (7) ดูเหมือนว่าคุณต้องใส่อักษรระบุไดรฟ์ในcwdเส้นทาง: 'c: / ... ' และไม่ใช่แค่ '/ ... '
Museful

29

วิธีการแก้ปัญหาของ Windows: แทนที่spawnด้วยโหนดข้ามวางไข่ เช่นนี้ที่จุดเริ่มต้นของ app.js ของคุณ:

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

2
ทำงานได้ยกเว้นเป็นแบบดรอปอินไม่จำเป็นต้องมี child_process เหมือนกับวิธีการวางไข่ของโหนดหรือ spawnSync ดังนั้นจึงเป็นการแทนที่ var spawn = require('cross-spawn'); // Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
Bogdan Trusca

27

@ คำตอบของ laconbass ช่วยฉันและอาจถูกต้องที่สุด

ฉันมาที่นี่เพราะฉันใช้ไข่ไม่ถูกต้อง เป็นตัวอย่างง่ายๆ:

สิ่งนี้ไม่ถูกต้อง:

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)เหตุการณ์นั้นจะเริ่มทำงานเสมอตราบใดที่มีการติดตั้ง bash ไม่เช่นนั้นcp.on('error', fn)เหตุการณ์อาจเริ่มต้นก่อนถ้าเราใช้วิธีแรกถ้าเราเปิดใช้ 'npm' โดยตรง


1
กำลังคิดในการปรับคำตอบของฉันใหม่เพื่อให้ "คำแนะนำทั่วไป" และให้รายละเอียดเกี่ยวกับสาเหตุของปัญหา (การพึ่งพานางสาวการโทรที่ไม่ถูกต้องสภาพแวดล้อมที่ไม่ถูกต้อง ... )
laconbass

2
ทุกคนที่ชอบคำตอบนี้อาจสนใจในตัวเลือกของพื้นเมืองนี้: gist.github.com/ORESoftware/7bf225f0045b4649de6848f1ea5def4c
Alexander Mills

1
Downvoted เพราะถ้าสิ่งที่คุณต้องการที่จะมีเป็นเปลือกแล้วคุณควรใช้child_process.execหรือผ่านไปshell: true spawn
givanse

@ givanse ไม่จำเป็นต้องเป็นจริง - คุณอาจต้องการเรียกใช้ zsh หรือ bash หรือ fsh ขึ้นอยู่กับว่าคุณต้องการใช้เชลล์แบบใดและพฤติกรรมก็แตกต่างกันเช่นกัน
Alexander Mills

22

สำหรับ ENOENT บน Windows ให้https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505แก้ไข

เช่นแทนที่วางไข่ ('npm', ['-v'], {stdio: 'สืบทอด'}) ด้วย:

  • สำหรับทุกรุ่น node.js:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
  • สำหรับ node.js 5.x และใหม่กว่า:

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

1
จะทำการปรับเปลี่ยนเหล่านี้ได้ที่ไหน
Deilan

8
มีการเพิ่มส่วนสำคัญshell: true
Ted Nyberg

19

สำหรับทุกคนที่อาจสะดุดเมื่อคำตอบอื่น ๆ ทั้งหมดไม่ได้ช่วยและคุณอยู่ใน Windows รู้ว่าขณะนี้มีปัญหาใหญ่spawnใน WindowsและPATHEXTตัวแปรสภาพแวดล้อมที่อาจทำให้เกิดการเรียกบางอย่างไปวางไข่ไม่ทำงานขึ้นอยู่กับวิธี คำสั่งเป้าหมายถูกติดตั้ง


2
และทางออกคืออะไร?
Nilzor

6
การใช้โหนดข้ามวางไข่ทำงานได้สำหรับฉัน ดูคำตอบด้านล่าง: stackoverflow.com/a/35561971/507339
Nilzor

1
ทุกวัยที่อยู่ในระบบพยายามที่จะค้นหาสิ่งที่ผิดและท้ายที่สุดก็เป็นปัญหา ฉันยอมแพ้spawnและใช้execแทน
reduckted

8

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เกิดขึ้นเนื่องจากทรัพยากรระบบที่จำเป็นขึ้นอยู่กับที่ไม่ได้ติดตั้ง

โดยเฉพาะอย่างยิ่งฉันมีแอพ NodeJS ที่ใช้ ImageMagick แม้จะมีการติดตั้งแพคเกจ npm แต่ยังไม่ได้ติดตั้ง Linux ImageMagick หลัก ฉันทำการติดตั้ง ImageMagick ได้ดีและหลังจากนั้นก็ใช้งานได้ดีมาก!


windows จำเป็นต้องติดตั้ง ImageMagick ด้วยหรือไม่ ฉันทดสอบบน windows และได้รับข้อผิดพลาด
Somename

6

ใน windows เพียงเพิ่มshell: trueตัวเลือกในการแก้ไขปัญหาของฉัน:

ที่ไม่ถูกต้อง:

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

แก้ไข:

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

5

คุณกำลังเปลี่ยนตัวenvเลือกหรือไม่?

จากนั้นดูคำตอบนี้


ฉันพยายามวางไข่กระบวนการโหนดและ TIL ที่คุณควรกระจายตัวแปรสภาพแวดล้อมที่มีอยู่เมื่อคุณวางไข่อื่นคุณจะหลวม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และติดตั้งแพคเกจใหม่

ติดตั้ง:

หาก lockfile มีอยู่คุณอาจใช้

yarn install --frozen-lockfile

หรือ

npm ci

respectivly ถ้าไม่เช่นนั้น

yarn install

หรือ

npm i

ว้าวเป็นวิธีแก้ปัญหาที่ง่ายและใช้งานได้สำหรับฉัน! ทุกคนควรลองวิธีนี้ก่อนเพื่อดูว่าสามารถแก้ไขปัญหาได้หรือไม่
Nick 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

ฉันกำลังประสบกับปัญหาที่น่ารำคาญนี้ในขณะที่ทำการทดสอบของฉันดังนั้นฉันจึงลองหลายวิธีในการแก้ไข แต่วิธีที่ใช้ได้ผลสำหรับฉันคือการรันนักวิ่งทดสอบของคุณจากไดเรกทอรีที่มีไฟล์หลักของคุณซึ่งรวมถึงฟังก์ชั่นการวางไข่ของnodejsดังนี้:

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

ตัวอย่างเช่นชื่อไฟล์นี้คือ test.jsดังนั้นเพียงย้ายไปยังโฟลเดอร์ที่มีอยู่ ในกรณีของฉันมันคือโฟลเดอร์ทดสอบแบบนี้:

cd root/test/

จากนั้นให้รันโปรแกรมทดสอบของคุณในกรณีของฉันคือมอคค่ามันจะเป็นเช่นนี้:

mocha test.js

ฉันเสียเวลาไปมากกว่าหนึ่งวันในการคิดออก สนุก!!


1

ฉันพบปัญหานี้ใน Windows ที่การโทรexecและspawnด้วยคำสั่งเดียวกัน (ละเว้นการขัดแย้ง) ทำงานได้ดีสำหรับexec(ดังนั้นฉันรู้ว่าคำสั่งของฉันเปิดอยู่$PATH) แต่spawnจะให้ ENOENT กลับกลายเป็นว่าฉันแค่ต้องการผนวก.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

ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามดีบักโปรแกรม node.js จากภายในตัวแก้ไขรหัส VS บนระบบ Debian Linux ฉันสังเกตเห็นว่าสิ่งเดียวกันทำงานได้ดีบน Windows โซลูชันที่ให้ไว้ก่อนหน้านี้ไม่ได้ช่วยอะไรมากนักเพราะฉันไม่ได้เขียนคำสั่ง "วางไข่" รหัสที่ละเมิดนั้นน่าจะถูกเขียนขึ้นโดย Microsoft และซ่อนอยู่ภายใต้ประทุนของโปรแกรม VS Code

ต่อไปฉันสังเกตเห็นว่า node.js เรียกว่า node บน Windows แต่บน Debian (และน่าจะเป็นบนระบบ Debian เช่น Ubuntu) เรียกว่า nodejs ดังนั้นฉันจึงสร้างนามแฝง - จากรูทเทอร์มินัลฉันวิ่งไป

ln -s / usr / bin / nodejs / usr / local / bin / node

และสิ่งนี้แก้ปัญหาได้ โพรซีเดอร์ที่เหมือนกันหรือคล้ายกันอาจจะทำงานในกรณีอื่น ๆ ที่ node.js ของคุณเรียกว่า nodejs แต่คุณกำลังรันโปรแกรมที่คาดว่ามันจะเรียกว่า node หรือในทางกลับกัน


0

หากคุณใช้ Windows Node.js ทำธุรกิจตลก ๆ เมื่อจัดการราคาที่อาจส่งผลให้คุณออกคำสั่งที่คุณรู้ว่าทำงานได้จากคอนโซล แต่ไม่ทำงานเมื่ออยู่ในโหนด ตัวอย่างเช่นสิ่งต่อไปนี้ควรใช้งานได้:

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

แต่ล้มเหลว มีตัวเลือกที่ไม่มีเอกสารที่ยอดเยี่ยมwindowsVerbatimArgumentsสำหรับการจัดการคำพูด / สิ่งที่คล้ายกันซึ่งดูเหมือนจะใช้เคล็ดลับเพียงแค่ให้แน่ใจว่าได้เพิ่มสิ่งต่อไปนี้ในวัตถุ opts ของคุณ:

const opts = {
    windowsVerbatimArguments: true
};

และคำสั่งของคุณควรจะกลับมาทำธุรกิจ

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

อย่าอ้างอาร์กิวเมนต์ภายในอาร์เรย์
laconbass

@laconbass นี่เป็นตัวอย่างเล็กน้อยที่เห็นได้ชัดในการถ่ายทอดแนวคิดและเพื่อให้สามารถลบเครื่องหมายคำพูดได้ อย่างไรก็ตามมีบางกรณีที่คุณจำเป็นต้องอ้างถึงอาร์กิวเมนต์ (ตัวอย่างเช่นถ้าคุณต้องการส่งอาร์กิวเมนต์ที่มีพา ธ ที่มีช่องว่างอยู่: "C: \ Program Files \ ... " ) ฉันโพสต์ไว้ที่นี่เพราะแม้ว่ามันอาจไม่ได้เป็นสาเหตุของข้อผิดพลาดเฉพาะของคุณ แต่หวังว่าจะช่วยให้คนอื่นประสบข้อผิดพลาดเกี่ยวกับรหัสลับนี้เนื่องจากการจัดการของอัญประกาศบนโหนดของ Windows เช่นเดียวกับที่ฉันพบ
Joel B

node.js ทำให้ Black Magic และคำพูด "อย่างถูกต้อง" อยู่แล้ว ตัวอย่างของคุณควรจะทำงานโดยไม่มีตัวเลือกที่ไม่มีเอกสารที่คุณพูดถึงโดยการถอนอาร์กิวเมนต์ในอาร์เรย์
laconbass

เพียงเพื่อเพิ่มประสบการณ์ของตัวเองฉันใช้กระบวนการจาวาจากโหนด ข้อผิดพลาดนี้เกิดขึ้นกับฉันเนื่องจากมีเครื่องหมายคำพูดล้อมรอบคำสั่งมากกว่าอาร์กิวเมนต์ ทดสอบช่องว่างในพา ธ คำสั่งและยังคงใช้งานได้โดยไม่ต้องใส่เครื่องหมายคำพูด
Troncoso

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 ได้อย่างไร
laconbass

ฉันไม่รู้ว่าทำไม แต่การวางไข่จะทำงานในโหนดที่แทนที่โดยไม่มี.cmdแต่ล้มเหลวในการทดสอบ jest typescript - ข้อผิดพลาดนี้ค่อนข้างยากที่จะเข้าใจคำตอบนี้สมควรได้รับการโหวตมากขึ้น
Mathieu CAROFF

0

ในกรณีที่คุณกำลังประสบปัญหานี้กับแอพลิเคชันที่มีแหล่งที่มาของคุณไม่สามารถแก้ไขพิจารณาอัญเชิญกับตัวแปรสภาพแวดล้อมNODE_DEBUGชุดเช่นchild_process NODE_DEBUG=child_process yarn testสิ่งนี้จะให้ข้อมูลกับคุณว่าบรรทัดคำสั่งใดถูกเรียกใช้ในไดเรกทอรีใดและโดยทั่วไปแล้วรายละเอียดสุดท้ายคือสาเหตุของความล้มเหลว


0

แม้ว่าอาจเป็นเส้นทางของสภาพแวดล้อมหรือปัญหาอื่นสำหรับบางคนฉันเพิ่งติดตั้งส่วนขยาย Latex Workshop สำหรับ Visual Studio Code บน Windows 10 และเห็นข้อผิดพลาดนี้เมื่อพยายามสร้าง / ดูตัวอย่าง PDF ใช้ VS Code ในฐานะผู้ดูแลระบบแก้ปัญหาให้ฉัน


1
อีกครั้งเส้นทางระบบไฟล์ที่เกี่ยวข้องทำบางวิธี ส่วนขยายอาจไม่สามารถเข้าถึงเส้นทางโดยไม่ได้รับอนุญาตจากผู้ดูแลระบบ
laconbass

-1

ฉันได้รับข้อผิดพลาดเดียวกันสำหรับ windows 8. ปัญหานี้เกิดจากตัวแปรสภาพแวดล้อมของเส้นทางระบบของคุณหายไป เพิ่มค่า "C: \ Windows \ System32 \" ให้กับตัวแปร PATH ของระบบของคุณ


-2

เพิ่มC:\Windows\System32\ให้กับpathตัวแปรสภาพแวดล้อม

ขั้นตอน

  1. ไปที่คอมพิวเตอร์และคุณสมบัติของฉัน

  2. คลิกที่การตั้งค่าขั้นสูง

  3. จากนั้นในตัวแปรสภาพแวดล้อม

  4. เลือกPathแล้วคลิกที่แก้ไข

  5. วางต่อไปนี้หากยังไม่มี: C:\Windows\System32\

  6. ปิดพรอมต์คำสั่ง

  7. เรียกใช้คำสั่งที่คุณต้องการเรียกใช้

สกรีนช็อตตัวแปร Windows 8 Environment


3
นี่เป็นคำตอบที่
Emile Bergeron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.