Express.js响应发送回调

时间:2017-10-20 23:05:03

标签: 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回调或什么?

3 个答案:

答案 0 :(得分:3)

  

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

是的,您应该在 curl -X POST -H "Authorization: Bearer <Bearer>" -H "Content-Type: application/json" -d '{ "user": { "name": "John", "last_name" : "Harrys", "user_name" : "JHarrys", "email": "JHarrys@noreply.com", "password" : "JHarrys1005", }, "user": { "name": "Mike", "last_name" : "Hanlon", "user_name" : "MHanlon", "email": "MHanlon@noreply.com", "password" : "5", } }' "https://<api host and port>/<service>/createUsers" [OperationContract] [WebInvoke(UriTemplate = "createUsers", Method = "POST", ResponseFormat = WebMessageFormat.Json)] public String createUsers(User user) { //code } [DataContract] public class User { [DataMember] public string name; [DataMember] public string last_name; [DataMember] public string user_name; [DataMember] public string email; [DataMember] public string password; } 实际完成后删除该文件。您可以使用res.sendFile()上的完成回调来了解其完成时间。

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

if (fs.existsSync(...))
  

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

是的,这是真的。

您还可以使用 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', ...)

答案 1 :(得分: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
       }
    }
  });

答案 2 :(得分:1)

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