我在 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/