请考虑这段代码:
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)
实际上并不等待命令完成。是因为它是管道的吗?
嗯 exec 并不是真的那样工作。
wait 关键字期望等待一个 Promise。由于 exec 只会返回一个子进程对象,并且需要调用回调然后准备好,所以这是行不通的。
但是node中有一个util可以将这些常规的node函数转换为promise函数,称为util.promisify。nodejs.org/api/util.html#util_util_promisify_original http://nodejs.org/api/util.html#util_util_promisify_original
这也显示在 exec 的文档中(参见https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)