【发布时间】:2022-01-25 22:12:51
【问题描述】:
请考虑这段代码:
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 不返回承诺,但需要在完成时触发回调。请看:nodejs.org/api/util.html#util_util_promisify_original
-
啊,是的!真丢人!谢谢!
标签: node.js async-await