Запустить внешнюю программу и получить результат ее выполнения позволяют функции exec()
, execFile()
и spawn()
из модуля child_process
. Импорт функций из модуля:
const { exec, execFile, spawn } = require('child_process');
Функция exec()
выполняет команду, переданную в первом параметре. Формат функции:
<ChildProcess> = exec(<Команда>[, <Опции>][, <Функция>])
В параметре <Опции>
можно передать объект с опциями. Полный список опций см. в документации. В параметре <Функция>
указывается ссылка на функцию, которая будет вызвана при завершении выполнения команды. Функция принимает три параметра. Через первый параметр доступен объект ошибки или значение null
. Через второй параметр доступны данные, выведенные в поток stdout
, в виде строки или Buffer
. Через третий параметр доступны данные, выведенные в поток stderr
, в виде строки или Buffer
. Объект Buffer
возвращается, если опция encoding
имеет значение buffer
или указана не поддерживаемая кодировка. Функция возвращает объект ChildProcess
. Операция выполняется асинхронно.
Пример преобразования изображения из формата JPEG в формат PNG с помощью программы ImageMagick при нажатии кнопки:
document.getElementById('btn1').addEventListener('click', () => {
exec('C:\\ImageMagick\\convert photo.jpg photo.png', {
cwd: __dirname,
timeout: 3000,
encoding: 'utf8'
}, (err, stdout, stderr) => {
if (err) {
console.log(err);
return;
}
console.log('stdout', stdout);
console.log('stderr', stderr);
});
});
Функция execFile()
имеет следующий формат:
<ChildProcess> = execFile(<Путь к файлу>[, <Аргументы>][, <Опции>][,
<Функция>])
В первом параметре указывается путь к запускаемому файлу. Обратите внимание: нельзя запустить файлы с расширениями bat
и cmd
, но можно запустить exe
. Аргументы, передаваемые программе, задаются в виде массива строк во втором параметре. В параметре <Опции>
можно передать объект с опциями. Полный список опций см. в документации. В параметре <Функция>
указывается ссылка на функцию, которая будет вызвана при завершении выполнения команды. Функция принимает три параметра. Через первый параметр доступен объект ошибки или значение null
. Через второй параметр доступны данные, выведенные в поток stdout
, в виде строки или Buffer
. Через третий параметр доступны данные, выведенные в поток stderr
, в виде строки или Buffer
. Объект Buffer
возвращается, если опция encoding
имеет значение buffer
или указана не поддерживаемая кодировка. Функция возвращает объект ChildProcess
. Операция выполняется асинхронно.
Пример:
document.getElementById('btn2').addEventListener('click', () => {
execFile('C:\\ImageMagick\\convert', ['photo.jpg', 'photo.png'], {
cwd: __dirname,
timeout: 3000,
encoding: 'utf8'
}, (err, stdout, stderr) => {
if (err) {
console.log(err);
return;
}
console.log('stdout', stdout);
console.log('stderr', stderr);
});
});
Функции exec()
и execFile()
ограничены объемом получаемых данных. Если объем превышает значение опции maxBuffer
, то будет ошибка. Функция spawn()
лишена этого недостатка. Формат функции:
<ChildProcess> = spawn(<Команда>[, <Аргументы>][, <Опции>])
В первом параметре указывается команда или путь к запускаемому файлу. Аргументы, передаваемые программе, задаются в виде массива строк во втором параметре. В параметре <Опции>
можно передать объект с опциями. Полный список опций см. в документации. Функция возвращает объект ChildProcess
. Операция выполняется асинхронно.
Получим EXIF-данные из изображения IMG_5377.cr2
:
document.getElementById('btn3').addEventListener('click', () => {
let cp = spawn('C:\\ImageMagick\\identify',
['-verbose', 'IMG_5377.cr2'], { cwd: __dirname });
cp.stdout.on('data', data => {
console.log(data.toString());
});
cp.stderr.on('data', data => {
console.log('stderr', data.toString());
});
cp.on('error', e => {
console.log('error', e);
});
cp.on('close', code => {
console.log('close', code);
});
});
Обработчик события data
будет вызываться несколько раз для каждой порции данных.
Существуют также функции execSync()
, execFileSync()
и spawnSync()
, которые операцию выполняют синхронно. За подробной информацией обращайтесь к документации.