使应用程序和NodeJS之间的连接保持活动状态2分钟

时间:2018-07-13 09:54:08

标签: javascript jquery node.js ajax

我正在尝试对NodeJS服务器进行jQuery ajax调用,然后该服务器将轮询另一个端点最多2分钟。

不幸的是,就像服务器已经完成轮询并即将响应jQuery ajax一样,连接被终止。

该路由如何不能仅在每条路由上保持2分钟的有效连接。这是我现在的AJAX帖子:

$.ajax({
    url:  $(this).attr("action"),
    type: 'POST',
    data: formdata,
    processData: false,
    contentType: false,
    beforeSend: function(request) {
        request.setRequestHeader("Keep-Alive", 'timeout=121, max=100')
    },
    success: function (res) {        
        if (res.status === 200) {
            Materialize.toast(res.msg, 4000, 'green')
        }
        else {
            Materialize.toast(res.msg, 4000, 'red')
        }
    },
    error: function (xhr, status, error) {
        Materialize.toast(error, 4000, 'red')
    }
})

当我检查请求标头时,未设置'Keep-Alive',我丢失了什么?

2 个答案:

答案 0 :(得分:1)

浏览器可以控制超时时间,因此您无能为力。我认为它们都在1-2分钟左右(我认为这很公平),显然,浏览器无法将套接字打开更长时间,因为这可能会导致性能问题,内存泄漏等。您可以在本地覆盖它们,但除了您自己,这对任何人都无济于事-默认用户将拥有默认的KeepAliveTimeout

您真正应该想到的是在这里实现想要的更好的解决方案。长时间保持套接字打开状态的任务是错误的。

我会考虑进行一次初始API调用,该调用会触发流程启动,然后仅将成功响应返回给UI,说“是的,这已经开始处理了。”。然后在您的API完成后,使用websockets向UI触发事件。有很多npm软件包可以支持这一点。

https://www.npmjs.com/package/websocket

https://www.npmjs.com/package/ws

您提出的解决方案无法在现实世界中生存,因此改变如何实现此目标的想法是解决此问题的最佳方法。可能不是您希望得到的答案,但是总体上改变这一点将极大地改善解决方案的一切。

祝你好运。

答案 1 :(得分:1)

您可以使用web socketsserver side events (SSE)来满足您的要求。而不是增加KeepAliveTimeout时间。