如何在使用 res.sendFile() 将请求发送回客户端之前等待文件创建完成

Posted

技术标签:

【中文标题】如何在使用 res.sendFile() 将请求发送回客户端之前等待文件创建完成【英文标题】:How to wait for the file to get created before sending request back to client using res.sendFile() 【发布时间】:2021-10-26 05:51:37 【问题描述】:

我有一个文件创建器块,它将文件写入磁盘,然后将文件发送到客户端。

但响应是在文件写入之前发送的。

  carbone.render("./template.odt", data, options, (err, ress) => 
    if (err) 
      return console.log(err);
    
    var paths = `./static/reports/report-$timestamp.pdf`;
    fs.writeFileSync(paths, ress);
    process.exit();
  );

  res.sendFile(
    path.join(__dirname, "..", "static", "reports", `report-$timestamp.pdf`)
  );

解决方案是什么让sendFile等待文件被写入然后获取它?

【问题讨论】:

您正在使用writeFileSync(),这意味着在该调用之后写入成功。你可以在它之后返回它 我已经尝试在writeFileSync之后添加响应,但它仍然不发送文件服务器发送Error: socket hang up 【参考方案1】:

这就是回调函数的用途。 carbone.render 渲染模板,完成后将结果返回给回调函数。 JS 在移动到 res.sendFile 之前不会等待 carbone.render 完成。您可以在回调函数中移动发送部分。

【讨论】:

删除 process.exit() 并在 writeFileSync 行工作后将其添加到渲染函数中。【参考方案2】:

你需要将sendFile代码添加到carbone.render的回调函数中,否则你可以参考this问题。

【讨论】:

以上是关于如何在使用 res.sendFile() 将请求发送回客户端之前等待文件创建完成的主要内容,如果未能解决你的问题,请参考以下文章

express:如何使用 sendFile 将 html 和 css 一起发送?

res.sendFile 绝对路径

Express res.sendFile 没有上传 CSS

res.sendFile 不是 Node.js 的函数

Angularjs - TypeError:路径必须是绝对路径或指定根到 res.sendFile

无法准确解读错误:TypeError:路径必须是绝对路径或在 ServerResponse.sendFile 处指定 res.sendFile 的根