Невозможно, чтобы вызов jQuery ajax длился более 4 минут, даже с заданным временем ожидания, с ошибкой net :: ERR_EMPTY_RESPONSE - PullRequest
0 голосов
/ 05 февраля 2019

У меня запущен сервер node.js, и я делаю серию ajax-вызовов на этот сервер через jquery.Ожидается, что один из вызовов ajax займет около 5 минут.Я обнаружил, что при выполнении вызова он всегда прерывается ровно через 4 минуты с ошибкой «net :: ERR_EMPTY_RESPONSE».Я видел такие вопросы, как следующие: ajax net :: ERR_EMPTY_RESPONSE после ожидания ответа в течение 2 минут - сервер node.js , но это происходит независимо от того, установлен ли параметр времени ожидания (либо 0, чтоозначает «нет времени ожидания» в jquery, или если я установлю его как нечто большее, чем 4 минуты - например, 300000, что составляет 5 минут.).Это происходит в точке 4 минуты, каждый раз.

У кого-нибудь есть идеи, почему это происходит?Существует ли верхний предел для вызовов jjery ajax, сколько времени они могут занять - независимо от того, какой параметр времени ожидания установлен?

Вот код, где выполняется вызов ajax:

(этоБлок try находится в функции, которая выполняет ajax-вызов определенного URL-адреса. url, jsonToSend и timeout - все параметры этой функции (в частности, timeout - это int, aчисло в миллисекундах , для ожидания до истечения времени ожидания вызова)

try {
    var ajaxCallConfig = {                                                                   
        method: action,                                                                      
        url: url,
        data: jsonToSend,
        contentType: "application/json",                                                     
        success: function (ret) {
            deferred.resolve(ret);                                                           
        },
        error: function (xhr, textStatus, errorThrown) { 
            // I ALWAYS end up in this block, with a net::ERR_EMPTY_RESPONSE being thrown, when I call this function to the long running api endpoint
            console.log("Error on Ajax call to " + url + "; json " +                         
                JSON.stringify(jsonToSend) +
                ";  text status: " + textStatus +
                "; error thrown: " + JSON.stringify(xhr));                                   
            // check if it was a timeout
            if (textStatus === 'timeout') {
                // some error handling my server does specific to timeouts...
                // left it out as it's not relevant... 
                // note : never hit this block, when the net::ERR_EMPTY_RESPONSE issue happens. (when i call the long-running api)
                // but I hit this block if i give some dummy low value to the 'timeout' param to force a timeout.                                                                      
            }
            else { 
                if (xhr.responseJSON) { 
                    // under this case, server sent the response and set                     
                    // the status code
                    deferred.reject(xhr.responseJSON);                                       
                }
                else { 
                    // under this case, the error status is not set by                       
                    // server, it may due to other reasons                                   
                    deferred.reject("Connection Error: " +
                        " Connection to server cannot be established");                      
                }                                                                            
            }                                                                                
        }                                                                                    
    }; 
    if (typeof timeout !== 'undefined') { 
        console.log("set a timeout of " + timeout);  // timeout is definitely being set, as I see this in console logs                                       
        ajaxCallConfig.timeout = timeout;  // timeout attr does work , because when I try this with a very low number, say 300, it times out immediately                                                  
    }
    jQuery.ajax(ajaxCallConfig);  // here we're making the ajax call                                                           
}

// перехватить блок, остаток функции ..

1 Ответ

0 голосов
/ 05 февраля 2019

Как ответил @MadWard - я хотел бы опубликовать это здесь на случай, если кто-нибудь еще наткнется на это!Сервер nodejs, который работал (на который ajax отправлял вызов ajax), по умолчанию имел время ожидания 4 минуты.Поэтому независимо от того, какое время ожидания я указывал jquery для выполнения вызова, если этот вызов занимал более 4 минут, сам сервер мог выдавать ошибку.

Поскольку это мой собственный сервер, я смог решить эту проблему с помощьюпросто увеличив атрибут «timeout» самого сервера nodejs.Вот пример (из файла, где определяется сервер nodejs):

var server = app.listen(serverPort, function () {                                                
    var host = server.address().address
    var port = server.address().port                                                             
    console.log("Example app listening at http://%s:%s", host, port)                             
}); 
server.timeout = 600000; // this was not set before.  The default appeared to have been 4 minutes. Setting this fixed it!  (NOTE this should be in milliseconds - so this is 10 minutes!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...