javascript - Express.js 响应发送回调

标签 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);

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

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

最佳答案

Is there a better way to do this tho? Is there a way to check for when the file has been sent so I can safely delete it? Maybe like a sendFile callback or something?

是的,您应该在 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); 
      }
    }
  });

I'm assuming Express does the sendFile async so it was deleting the file before it actually sent.

是的,确实如此。

<小时/>

您还可以使用 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); 
      }
  });

关于javascript - Express.js 响应发送回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858445/

相关文章:

javascript - V8之后的JS是解释还是编译?

javascript - 倒数计时器加载器动画

javascript - 获取不支持的 MIME 类型

javascript - express ,使用不同进口的相同路线?

javascript - Nodejs中的回调错误参数命名约定

javascript - 除了显示 jQuery Ajax DataTable 的数量之外,如何将分页下拉列表移动到底部

javascript - 如何更改 li 标签内的特定组件(react js);

node.js - 配置 VSC 的 launch.json 以启动 webpack-dev-server

javascript - Store 没有带有 mergeReducer 的有效 reducer

javascript - Node + Express + Passport + Mongoose : req. 用户未定义