代码之家  ›  专栏  ›  技术社区  ›  Charlie Fish

表示js响应发送回调

  •  3
  • Charlie Fish  · 技术社区  · 8 年前

    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 异步,因此它在实际发送之前删除了文件。

    有更好的方法吗?有没有办法检查文件何时发送,这样我就可以安全地删除它?也许像一个 发送文件 回调还是什么?

    3 回复  |  直到 8 年前
        1
  •  7
  •   jfriend00    8 年前

    有更好的方法吗?有没有办法检查文件何时发送,这样我就可以安全地删除它?也许像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); 
          }
        }
      });
    

    是的,这是真的。


    你也可以使用 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); 
          }
      });
    
        2
  •  1
  •   digit    8 年前

    当传输完成或发生错误时,该方法调用回调函数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
           }
        }
      });
    
        3
  •  1
  •   Charlie Fish    8 年前

    主要缺点 res.on('finish', ...) 它不是在响应关闭或出现错误时调用的。使用 on-finished 将在关闭、完成或出错时运行回调。这在删除文件时尤其有用,即使在出现错误或类似情况时,您也要删除该文件。