我在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
回调或什么?
答案 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将在关闭,完成或错误时运行回调。这对于删除要删除文件的文件尤其有用,即使出现错误或类似情况也是如此。