node.js - 您如何以编程方式退出事件中的 node.js/express 路由?
问题描述
当从客户端发送事件时,我希望能够退出发布路由的执行。我正在使用socket.io,但我不确定它是否可以做我想做的事。我正在使用uploads
路由来处理文件,但是如果用户删除了文件,我希望app.post
执行结束,类似于 a res.end()
orreturn
语句。
我在前端的应用程序从用户那里收到一个文件,并立即发送到 post 路由进行处理。如果用户删除文件并上传新文件,则之前的发布路线仍在进行。我想确保前一个被终止、取消等。
我目前正在使用 socket.io 将前端与后端通信。
我怎样才能做到这一点?
app.post('/uploads', async (req, res) => {
// async func1
// async func2
// if we receive an event from the front end while processing here, how can I exit the post route?
// async func3
});
解决方案
您可以UUID
为您提出的每个请求添加并将其返回到front-end
. 请求将使用202 ACCEPTED
状态码解析,这意味着请求已被接受并正在处理,但 HTTP 请求将被解析。
现在,您可以实现一个resourceManagerServeic
允许 API(http
或ws
)更改资源状态(如取消它)的方法。
app.post('/uploads', async (req, res) => {
const resourceUuid = resourceManagerServeic.createResource();
res.status(202); // ACCEPTED
res.send({ uuid: resourceUuid });
// start besnise logic
await function1();
if(resourceManagerServeic.isCanceled(resourceUuid)) {
// cleanup
return; // stop request handling
}
await function2();
if(resourceManagerServeic.isCanceled(resourceUuid)) {
// cleanup
return; // stop request handling
}
await function3();
if(resourceManagerServeic.isCanceled(resourceUuid)) {
// cleanup
return; // stop request handling
}
});
app.del('/uploads/:resourceUuid', async (req, res) => {
resourceManagerServeic.cancle(req.params.resourceUuid);
res.end() // handle response
});
推荐阅读
- c++ - 访问 MultiDim 数组会给出 Seg Fault C++
- android - Android 布局组织
- mysql - Group by with 子句 a key 不相等
- python - Python中的平滑曲面图
- java - 在 ByteBuddy 中使用 @Advice.AllArguments 是否可以拦截没有参数的方法?
- wordpress - Woocommerce 操作“woocommerce_order_status_completed”未执行
- reactjs - 复选框中的字符串值
- java - Tomcat 9+:使用 @WebServlet 注释覆盖 Servlet 映射
- git - 如何在 Eclipse (egit) 中一次导入多个 Git 项目?
- keycloak - Keycloak 客户端部署最佳实践