代码之家  ›  专栏  ›  技术社区  ›  Iqlas Uddin

如果请求被中断,请在后端继续处理

  •  0
  • Iqlas Uddin  · 技术社区  · 7 年前

    我正在使用nodejs连接到MsSQL服务器,获取数据,处理数据并将其以所需的格式发布到webapi。

    场景是:在nodejs中,我有执行上述工作的脚本。它当前由使用axios的网页上的按钮启动(或者我应该说是触发的?) POST 所有必要的参数。如下图所示:

    axios.post('/api/v1/fetch-new-labors', {
      startDate: 'somedate',
      endDate: 'someDate' 
    }).then(...handles further processing & posting to api)
    

    整个过程大约需要2-3分钟才能完成。同时,如果页面被刷新,显然需要通过单击按钮重新启动整个过程。

    x out of y records posted 差不多吧。我想到了websockets,但我不确定是否有更好的方法来实现这一点。我不是在寻找整个代码/过程,我是在寻找一个人来指导我走向整体概念/想法。

    1 回复  |  直到 7 年前
        1
  •  3
  •   nicholaswmin    7 年前

    热释光;博士: 长时间运行的作业通常避免使用传统的 request-response 循环,而不是选择一些变化的 Pub/Sub

    接受请求,然后开始处理

    HTTP 202: Accepted ,表示您接受了请求,然后开始处理。

    您可以在响应之前执行一些初始检查(用户是否有其他作业?请求是否通过了基本的验证检查?),但您不应该在响应之前开始处理实际的长时间运行的作业。

    您可以使用一个简单的HTTP请求来创建作业。

    将状态更新从服务器推送到订阅的客户端

    在页面上加载客户端 订阅

    使用 WebSockets

    UUID 通过 LocalStorage

    在接受新作业之前,请检查用户是否已在运行作业

    当用户刷新时,您可以通过WebSockets再次发送初始消息,通知用户是否有正在运行的作业及其进度。

    根据您的操作,我认为如果有一个挂起的作业,您可能需要禁用“创建作业”按钮。


    long-polling / Server-sent Events )如果您愿意,尽管WebSockets应该是最直接和灵活的解决方案。

    我个人喜欢一个包含电池的WebSocket库,比如 socket.io

    推荐文章