gpt4 book ai didi

javascript - Express.js 响应发送回调

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:07 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com