节点js:child_process.exec实际上没有等待

2024-02-11

请考虑这段代码:

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(使用前将#替换为@)

节点js:child_process.exec实际上没有等待 的相关文章

随机推荐

  • request-promise-native 的替代方案[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找在 Node js 中实现基本 HTTP 方法 例如 GET POST 的现代模块 我想最受
  • 片段中的 EditText 和软键盘问题

    我目前正在构建一个 Android 应用程序 使用户能够拍照并写入其详细信息 该应用程序使用 Sherlock 库 我实现了一个 SherlockFragment 来显示图像 以及一些 EditText 和 TextView 来使用户能够键
  • 使用正则表达式匹配数字 - 仅数字和逗号

    我无法弄清楚如何为示例值构建正则表达式 123 456 789 12 34 1234 8 你可以帮帮我吗 什么是数字 我有一个简单的问题your 简单 问题 一个数字 到底是什么意思 Is 0一个号码 你对这个怎么看 1 Is or 一个号
  • 如何通过 ID 从另一个网站获取元素 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想通过其 ID 从另一个站点获取 div 的内容 比方说 我有一个网站 我想从这个 URL 获取 id 为 mainbar 的 di
  • 如何用C语言生成GUID?

    我想生成插入 SQLite 数据库的 guid 即数据库本身不支持 但是 我想控制某些属性 用于生成不断增加的指导值的有序性 计算机独立性 数据库是公共的 可能 可能不希望 guid 允许某人将数据追溯到特定机器 足够 的随机性 guid
  • S3方法:扩展ggplot2`+.gg`函数

    我正在尝试延长ggplot2一个新的类 我们称之为foo对于这个例子 目标是写一个 foo将用来代替的方法 gg 但是我遇到了 方法不兼容 的问题 设置 目前我可以写ggplot add foo layer这将使plot进入我的foocla
  • 如何重新计算单元格的公式?

    我的代码设置了很多单元格值 最后 在生成 Excel 文件之前需要评估每个单元格中的公式 对于大多数床单来说 一切进展顺利 但是 有一个单元格抛出异常 该单元格正在计算其后面的一系列单元格以及其他工作表中的参考单元格的平均值 我猜当第一个单
  • R:如何使用正则表达式对列表元素进行分组和聚合?

    我想按组汇总 总结 以下产品列表 见下文 prods lt list 101 2000 data frame 1 2 3 102 2000 data frame 4 5 6 103 2000 data frame 7 8 9 104 200
  • 通过 request 在 Node.js 中获取下载进度

    我正在创建一个使用 Node 模块下载应用程序文件的更新程序request 我该如何使用chunk length估计剩余文件大小 这是我的代码的一部分 var file url http foo com bar zip var out fs
  • 使用 Java 将文件上传并 POST 到 PHP 页面

    我需要一种上传文件并将其 POST 到 php 页面的方法 我的 php 页面是
  • C++ 中的字符串分配:为什么会这样? [复制]

    这个问题在这里已经有答案了 void changeString const char s std string str s str replace 0 5 Howdy s str c str int main const char s He
  • 如何在 Python 中创建带有复选框的树视图

    我一直在使用 Tkinter 和 Tix 编写一个小程序 我现在需要一个带有复选框 复选框 的树视图 以便我可以从树视图中选择项目 是否有捷径可寻 我一直在研究 ttk Treeview 看起来很容易获得树视图 但是有没有办法在视图中插入复
  • Axios 拦截器令牌标头存在于配置中,但不存在于请求标头中

    我创建了 axios 拦截器 它负责在每个请求发送到我的其余 API 之前添加令牌 import axios from axios import store from store store export default function
  • IHttpContextAccessor 会话 GetString

    我正在尝试使用 NET Core 运行时将 ASP NET MVC 站点迁移到 ASP NET Core 以前 我们可以从会话存储中获取对象 即使在不同的程序集中 也可以使用 var obj HttpContext Current Sess
  • 如何无限迭代列表,每次循环 +1 偏移量

    我想从 0 到末尾无限迭代列表 但在下一个循环中 我想从 1 开始到末尾加 0 下一个循环将从 2 开始到末尾加 0 1 直到最后一项将从 0 重新开始并到达末尾 这是我的代码 a 0 1 2 offset 0 rotate 0 while
  • 如何从 R Shiny 应用程序中数据表中的选定行获取行值

    我需要从 DT 数据表中获取所选行第一列的值 使用 数据表 rows selected 我能够获取选定的行数 现在我正在寻找从数据表中提取行值的方法 在下面的例子中 有两个观察事件基于操作按钮 第一个观察事件被导入并显示数据 第二个观察事件
  • 无法在 Atom 中安装 platformio-ide-terminal

    我是 python 的初学者 从昨天开始学习它 我面临以下错误 Installing email protected cdn cgi l email protection failed gt email protected cdn cgi
  • 在 svg 上居中对齐饼图

    我试图让一个饼图示例起作用 其中图表的位置在其包含的元素内居中对齐 在本例中只是一个简单的 div 设置为使用 100 可用宽度 看到这个fiddle http jsfiddle net 2qeab2ds 1 正如您所看到的 图表的中心位于
  • 为什么 R 会话特定的临时目录会在长时间运行的 R 进程中消失?

    R 使用 mkdtemp 在 TMPDIR 的子目录中创建特定于会话的临时目录 并在 R 退出时删除该目录树 调用 tempfile 和调用 pdf 时默认使用此目录 我发现对于一些运行时间非常长 例如 2 天 的 Rscript 作业 特
  • 节点js:child_process.exec实际上没有等待

    请考虑这段代码 var cmd cd dir curl L url tar xJvf zip qr archive zip await exec cmd res sendFile path join dir archive zip 它下载