我正在向node.js服务器发出xmlhttprequest。请求后,服务器联系远程服务器以执行处理并将结果返回给浏览器。问题是当处理需要很长时间(几分钟)时,浏览器向服务器发出第二个请求。我已经尝试将超时xmlhttprequest属性更改为10分钟(处理时间较短,可能是4分钟),但我仍然会重复请求(这发生在chrome和firefox中)。这是我的http请求代码(fd是一个formdata对象):
var request = new XMLHttpRequest();
request.onretry = function () { alert("Retrying...") }
request.onreadystatechange=function()
{
if (request.readyState == 4)
{
document.getElementById("progress_div").style.display='none';
document.getElementById("classifybutton").disabled = false;
if (request.status >= 200 && request.status < 300)
{
var res = JSON.parse(request.response);
// DISPLAY RESULTS
}
else
{
var res = JSON.parse(request.response);
alert("Error: " + res.error);
}
}
}
request.onerror=function()
{
document.getElementById("progress_div").style.display='none';
document.getElementById("classifybutton").disabled = false;
alert("There was an error contacting the server");
}
request.open('POST', '/sendall', true);
request.timeout = 600000;
request.ontimeout = function () { alert("Timed out!!!"); }
request.send(fd);
请注意,不会调用ontimeout,onretry或onerror函数。这可能是在函数之前产生的(即按下按钮时调用中的某种方式)?
发现问题(我无法等待8小时回答我自己的问题所以这是解决方案):
原来问题不在于客户端与node.js服务器的关系。默认情况下,它会在2分钟后超时套接字,因此客户端会复制请求。要更改此添加:
.on('connection', function(socket) {
socket.setTimeout(20 * 60 * 1000); // set to a 20 min timeout
})
到server.createServer(有关详细信息,请参阅http://nodejs.org/api/http.html#http_server_timeout)。
答案 0 :(得分:0)
试试这个检查this.status == 200
request.onreadystatechange=function()
{
if (request.readyState == 4 && this.status == 200)
{
document.getElementById("progress_div").style.display='none';
document.getElementById("classifybutton").disabled = false;
if (request.status >= 200 && request.status < 300)
{
var res = JSON.parse(request.response);
// DISPLAY RESULTS
}
else
{
var res = JSON.parse(request.response);
alert("Error: " + res.error);
}
}
}
答案 1 :(得分:0)
原来问题不在于客户端与node.js服务器的关系。默认情况下,它会在2分钟后超时套接字,因此客户端会复制请求。要更改此添加:
.on('connection', function(socket) {
socket.setTimeout(20 * 60 * 1000); // set to a 20 min timeout
})
到server.createServer(有关详细信息,请参阅http://nodejs.org/api/http.html#http_server_timeout)。