首页 > 解决方案 > 您如何以编程方式退出事件中的 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
});

标签: node.jsexpresssocket.io

解决方案


您可以UUID为您提出的每个请求添加并将其返回到front-end. 请求将使用202 ACCEPTED状态码解析,这意味着请求已被接受并正在处理,但 HTTP 请求将被解析。

现在,您可以实现一个resourceManagerServeic允许 API(httpws)更改资源状态(如取消它)的方法。

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
});

推荐阅读