Дочерний процесс порождения узла не работает в windows - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть простая настройка скрипта с использованием spawn на windows, и его вывод:

spawn error: Error: spawn dir ENOENT
spawn child process closed with code -4058

Вот код:

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

const spawnTest = (() => {
  const dir = spawn('dir');

  dir.stdout.on('data', (data) => {
    console.log(`spawn stdout: ${data}`);
  });

  dir.stderr.on('data', (data) => {
    console.log(`spawn stderr: ${data}`);
  });

  dir.on('error', (code) => {
    console.log(`spawn error: ${code}`);
  });

  dir.on('close', (code) => {
    console.log(`spawn child process closed with code ${code}`);
  });

  dir.on('exit', (code) => {
    console.log(`spawn child process exited with code ${code}`);
  });
})();

1 Ответ

0 голосов
/ 25 февраля 2020

Вам нужна опция shell: true для spawn(), как в spawn('dir', {shell: true});.

Этот код работает, как и ожидалось, на Windows:

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

const spawnTest = (() => {
  const dir = spawn('dir', {shell: true});       // <== shell: true option

  dir.stdout.on('data', (data) => {
    console.log(`spawn stdout: ${data}`);
  });

  dir.stderr.on('data', (data) => {
    console.log(`spawn stderr: ${data}`);
  });

  dir.on('error', (code) => {
    console.log(`spawn error: ${code}`);
  });

  dir.on('close', (code) => {
    console.log(`spawn child process closed with code ${code}`);
  });

  dir.on('exit', (code) => {
    console.log(`spawn child process exited with code ${code}`);
  });
})();

Я предполагаю, что, поскольку dir не является реальной программой (в Windows нет dir.exe) Вы должны указать команде spawn(), должна ли она выполняться в командной оболочке или без командной оболочки. В то время как на других платформах такие вещи, как ls, являются реальными программами, которые могут быть запущены в любом случае.

...