Express.js 响应发送回调

Cha*_*ish 3 javascript node.js express

我在 Node/Express 中有以下代码,它发送一个文件作为响应,然后使用超时删除该文件。

res.sendFile(req.params.id, { root: process.env.UPLOADPATH });

setTimeout(function () {
    if (fs.existsSync(process.env.UPLOADPATH + req.params.id)) { // check to ensure file still exists on file system
        fs.unlink(process.env.UPLOADPATH + req.params.id); // delete file from server file system after 60 seconds
    }
}, 60000);
Run Code Online (Sandbox Code Playgroud)

如果我没有使用setTimeout它,它会因错误而失败。我假设 Express 执行sendFile异步操作,因此它在实际发送之前删除了文件。

有没有更好的方法来做到这一点?有没有办法检查文件何时发送,以便我可以安全地删除它?也许像sendFile回调之类的?

jfr*_*d00 7

有没有更好的方法来做到这一点?有没有办法检查文件何时发送,以便我可以安全地删除它?也许像 sendFile 回调或什么?

是的,您应该在res.sendFile()实际完成后删除该文件。您可以使用完成回调res.sendFile()来了解何时完成。

此外,使用if (fs.existsSync(...))然后删除文件是一种反模式,因为它可能会受到竞争条件的影响。如果您想删除文件,只需删除它并处理您可能遇到的任何错误:

  let filename = path.join(process.env.UPLOADPATH, req.params.id);
  res.sendFile(filename, function (err) {
    if (err) {
      next(err);
    } else {
      try {
        fs.unlink(filename); 
      } catch(e) {
        console.log("error removing ", filename); 
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

我假设 Express 执行 sendFile 异步,因此它在实际发送之前删除了文件。

是的,这是真的。


您还可以使用该res.on('finish', ...)事件来了解何时完成响应的发送。

  let filename = path.join(process.env.UPLOADPATH, req.params.id);
  res.sendFile(filename);
  res.on('finish', function() {
      try {
        fs.unlink(filename); 
      } catch(e) {
        console.log("error removing ", filename); 
      }
  });
Run Code Online (Sandbox Code Playgroud)