Express.js响应发送回调函数

3

我在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回调这样的东西?

5
当res(响应对象)完成时,执行以下代码: - Keith
@Keith 我可以在我的 app.get 函数内运行这个吗? - Charlie Fish
1
是的,那应该可以正常工作。 - Keith
3个回答

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); 
      }
    }
  });

我假设Express会异步地发送文件,这样它实际发送之前就会将文件删除。

是的,那是正确的。


你也可以使用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); 
      }
  });

1
res.on('finish', ...) 的主要缺点是它不会在响应关闭或发生错误时被调用。使用 on-finished 会在关闭、完成或出现错误时运行回调函数。这对于删除文件的情况非常有帮助,因为即使发生错误或类似情况,您也希望删除该文件。

1
该方法在传输完成或出现错误时调用回调函数fn(err)。如果指定了回调函数并且发生错误,则回调函数必须明确处理响应过程,以结束请求-响应周期。
  res.sendFile(fileName, { root: process.env.UPLOADPATH }, function (err) {
    if (err) {
      next(err);
    } else {
      // File has been sent
      console.log('Sent:', fileName);

       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
       }
    }
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接