在 Node.js 中,可以通过 child_process
模块来执行命令行二进制文件。该模块提供了 exec()
和 spawn()
两个函数,用于在子进程中执行命令。
exec()
函数用于执行一个命令并返回其完整输出。如果命令执行成功,则 exec()
函数会返回一个包含 stdout
和 stderr
的对象,其中 stdout
是命令的标准输出,stderr
是命令的标准错误。如果命令执行失败,则 exec()
函数会返回一个错误对象。
spawn()
函数用于创建一个子进程并在其中执行一个命令。该函数会返回一个 ChildProcess
对象,该对象可以用来控制子进程并获取其输出。
以下是一个使用 exec()
函数执行命令行二进制文件的示例:
const { exec } = require("child_process");
// 执行命令 "prince -v builds/pdf/book.html -o builds/pdf/book.pdf"
const { stdout, stderr } = await exec(
"prince -v builds/pdf/book.html -o builds/pdf/book.pdf"
);
if (stderr) {
// 命令执行失败
console.error(stderr);
} else {
// 命令执行成功
console.log(stdout);
}
以下是一个使用 spawn()
函数执行命令行二进制文件的示例:
const { spawn } = require("child_process");
// 创建一个子进程并在其中执行命令 "prince -v builds/pdf/book.html -o builds/pdf/book.pdf"
const child = spawn("prince", [
"-v",
"builds/pdf/book.html",
"-o",
"builds/pdf/book.pdf",
]);
// 获取子进程的标准输出
child.stdout.on("data", chunk => {
console.log(chunk);
});
// 获取子进程的标准错误
child.stderr.on("data", chunk => {
console.error(chunk);
});
// 子进程退出时触发
child.on("exit", code => {
console.log(`子进程退出,退出码:${code}`);
});
哪个函数更适合使用取决于具体的场景。如果只需要获取命令的完整输出,则可以使用 exec()
函数。如果需要控制子进程并在其退出时获取其输出,则可以使用 spawn()
函数。
注意事项
- 在使用
exec()
函数时,需要注意命令的输出可能会很大,如果命令的输出超过了 Node.js 的缓冲区大小,则会导致 Node.js 进程崩溃。 - 在使用
spawn()
函数时,需要注意子进程的标准输出和标准错误都是流,如果需要将子进程的输出保存到文件中,则需要使用流的相关 API。 - 在使用
child_process
模块时,需要注意子进程可能会阻塞 Node.js 的主线程,如果需要在子进程中执行长时间的任务,则可以考虑使用worker_threads
模块来创建工作线程。