如何解决在Express请求中处理长I / O操作的最佳实践
寻求有关在Express请求处理程序中处理长时间I / O操作的最佳模式的输入。具体来说,我将把一个上传的文件复制到S3,但是不需要I / O完成即可完成对请求的处理。 (注意:需要在服务器上拥有本地副本,因此直接上传到S3不是解决方案。)
我有一个可行的解决方案,可以将文件异步复制到S3,但是在从请求返回之前,它不会等待副本完成。此解决方案没有明显问题。但是,这种方法似乎有缺陷,并且可能存在更好的模式(我对JS还是比较陌生的。)
我可以选择将复制任务排队并在后台处理。但是在添加更多代码之前,请检查我所关注的问题是否有效,或者按原样实现的方式是否存在问题。
任何见解都很感激。
编辑:添加了显示模式的示例代码
/* Async handler because await on some other (not related to S3 copy)stuff to complete before returning (but must faster completion than the S3 copy */
app.get("/some/route",async (req,res) => {
s3.upload(/* args */).then(() => {
// log success
}).catch((e) => {
// log error
})
// A few lines of code
res.status(200).send('Done');
// We be done before s3.upload completes
});
解决方法
根据情况,您上传文件(资源)的方法非常好。
我建议以下以提高将来的可用性:
- 在上载请求中,为资源生成一个UUID并将其返回给用户(此UUID将允许用户管理资源)。使用
202 Accepted
作为响应状态代码。 - 添加API以查询资源状态。这将返回有关资源状态的信息,例如
uploading
|done
|not_exsist
- (很高兴)添加API以中止上传
- (很高兴)添加WebSocket,可以将资源状态通知客户端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。