我正在尝试对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',我丢失了什么?
答案 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 sockets或server side events (SSE)来满足您的要求。而不是增加KeepAliveTimeout
时间。