Cha*_*ish 3 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);
Run Code Online (Sandbox Code Playgroud)
如果我没有使用setTimeout它,它会因错误而失败。我假设 Express 执行sendFile异步操作,因此它在实际发送之前删除了文件。
有没有更好的方法来做到这一点?有没有办法检查文件何时发送,以便我可以安全地删除它?也许像sendFile回调之类的?
有没有更好的方法来做到这一点?有没有办法检查文件何时发送,以便我可以安全地删除它?也许像 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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我假设 Express 执行 sendFile 异步,因此它在实际发送之前删除了文件。
是的,这是真的。
您还可以使用该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);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3437 次 |
| 最近记录: |