узел js: child_process.exec фактически не ожидает - PullRequest
0 голосов
/ 09 мая 2018

Пожалуйста, рассмотрите этот кусок кода:

var cmd = `cd "${dir}" && curl -L "${url}" | tar -xJvf - | zip -qr archive.zip -@`;
await exec(cmd);
res.sendFile(path.join(dir, "archive.zip"));

Он загружает .tar.xz, распаковывает его, распаковывает и, наконец, отправляет пользователю.

Если я запустил его, произойдет сбой при res.sendFile(...), сообщив, что файл не существует. Однако, если я загляну в свою файловую систему, zip на самом деле там.

Поэтому я попытался добавить небольшую задержку перед res.sendFile(...), например:

var cmd = `cd "${dir}" && curl -L "${url}" | tar -xJvf - | zip -qr archive.zip -@`;
await exec(cmd);

setTimeout(()=>{
    res.contentType(path.join(dir, "archive.zip"));
    res.sendFile(path.join(dir, "archive.zip"));
}, 1000);

... и это волшебным образом сработало.

Кажется, что exec(cmd) на самом деле не ожидает завершения команды. Это из-за того, что по трубопроводу?

1 Ответ

0 голосов
/ 09 мая 2018

Ну, exec действительно не работает так.

Ключевое слово await ожидает, что Promise будет ждать. Так как exec будет возвращать только дочерний объект процесса и требует обратного вызова, то готово, это не сработает.

Но в узле есть утилита для преобразования этих функций обычного узла в функции обещания, называемые util.promisify. nodejs.org / апи / util.html # util_util_promisify_original

это также показано в документации exec (см. https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback в конце этого абзаца)

let util = require('util')
let exec = require('child_process').exec
let exec_prom = util.promisify(exec)

exec_prom('ip address').then(()=>{console.log('done')})


async function do(){
  await exec_prom('ip address');
  // do something after
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...