我试图对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”,我丢失了什么?

最佳答案

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

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

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

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

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

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

祝好运。

关于javascript - 使应用程序和NodeJS之间的连接保持事件状态2分钟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51322471/

10-09 21:39