我正在将一个CLI库从Ruby over移植到Node.js。在我的代码中,必要时我会执行几个第三方二进制文件。我不确定如何最好地在Node中完成这一点
下面是Ruby中的一个示例,我调用PrinceXML将文件转换为PDF:
cmd=system(“prince-v builds/pdf/book.html-o builds/pdf/book.pdf”)
节点中的等效代码是什么
对于更新版本的Node.js(v8.1.4),事件和调用与旧版本类似或相同,但鼓励使用标准的更新语言功能。示例:
对于缓冲的、非流格式的输出(您可以一次获得所有输出),请使用child\u process.exec:
const{exec}=require('child_process');
exec('cat*.js bad_file | wc-l',(err、stdout、stderr)=>{
如果(错误){
//节点无法执行该命令
回来
}
//*整个*标准输出和标准输出(缓冲)
log(`stdout:${stdout}`);
log(`stderr:${stderr}`);
});
您也可以将其用于承诺:
const util=require('util');
const exec=util.promisify(require('child_process').exec);
异步函数ls(){
const{stdout,stderr}=await exec('ls');
log('stdout:',stdout);
log('stderr:',stderr);
}
ls();
如果希望以块的形式逐渐接收数据(以流的形式输出),请使用child\u process.spawn:
const{spawn}=require('child_process');
const child=spawn('ls',['-lh','/usr']);
//使用child.stdout.setEncoding('utf8');如果你想要文本块
child.stdout.on('data',(chunk)=>{
//来自标准输出的数据在此作为缓冲区
});
//由于这些是流,您可以将它们输送到其他地方
子标准管道(目的地);
子.on('关闭',(代码)=>{
log(`child进程已退出,代码为${code}`);
});
这两个函数都有一个同步的对应项。子进程.execSync示例:
const{execSync}=require('child_process');
//stderr被发送到父进程的stderr
//如果您希望它转到其他位置,可以设置options.stdio
设stdout=execSync('ls');
以及子进程。spawnSync:
const{spawnSync}=require('child_process');
const child=spawnSync('ls',['-lh','/usr']);
console.log('error',child.error);
console.log('stdout',child.stdout);
console.log('stderr',child.stderr);
注意:以下代码仍然有效,但主要针对ES5及以前版本的用户
文档(v5.0.0)中详细介绍了使用Node.js生成子进程的模块。要执行命令并获取其作为缓冲区的完整输出,请使用child\u process.exec:
var exec=require('child_process')。exec;
var cmd='prince-v builds/pdf/book.html-o builds/pdf/book.pdf';
exec(命令,函数(错误,标准输出,标准输出){
//命令输出为标准输出
});
如果需要对流使用句柄进程I/O,例如当您需要大量输出时,请使用child\u process.spawn:
var spawn=require('child_process')。spawn;
var child=spawn('prince'[
“-v”,“builds/pdf/book.html”,
“-o”,“builds/pdf/book.pdf”
]);
child.stdout.on('data',函数(块){
//输出将在这里分块显示
});
//或者,如果您想将输出发送到其他地方
子标准管道(目的地);
如果执行的是文件而不是命令,则可能需要使用child\u process.execFile,这些参数几乎与spawn相同,但有第四个回调参数,如exec,用于检索输出缓冲区。看起来可能有点像这样:
var execFile=require('child_process')。execFile;
execFile(文件、参数、选项、函数(错误、标准输出、标准输出){
//命令输出为标准输出
});
从v0.11.12开始,节点现在支持同步spawn和exec。上面描述的所有方法都是异步的,并且都有一个同步的对应方法。有关它们的文档可以在这里找到。虽然它们对脚本编写很有用,但请注意,与用于异步生成子进程的方法不同,同步方法不会返回ChildProcess的实例