Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 27.11.2014, 16:00
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ascherbakov
не выполняется... куда еще копнуть?
То есть запрос повисает в ожидании, пока не наступит таймаут?
Проблема значит на серваке. Видимо у тебя слишком доолго выполняется sql
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #12 (permalink)  
Старый 27.11.2014, 16:26
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

в консоли браузера появляется вот такая запись:
Код:
GET http://mysite.info/result?IP=10.10.10.1&CODE=12&START=27.11.2013&END=27.11.2014 502 (Bad Gateway)
хотя на сервере есть записи о том, что отправка запустилась:
function SendClient(res, jsonData) {
    console.log("SendClient"); //эта запись выводится
    res.end(jsonData);
}

вот только отправка запустилась, но не факт что сервер смог её выполнить, в результате ngnix вернул 502
я правильно понимаю?
таймаут в nginx установлен на 600 сек.
ограничение по объему 300 мегабайт.
похоже дело все же в node видимо в самой node есть ограничение на объем отправляемых данных.
может кто знает какой и можно ли его как-то настроить?
Ответить с цитированием
  #13 (permalink)  
Старый 27.11.2014, 22:40
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

sql запрос отрабатывает за чуть больше чем 2 минуты. ошибку по таймауту самой ноды исключил.
в app.js добавил следующее:
var timeout = express.timeout; // для версии 3.5
app.use(timeout(600000));

спачала оставил кол-во милисекунд по умолчанию 120000, в результате того что скуль запрос выполнялся дольше, то отвалился по таймауту.
выставил 600000, чтоб наверняка.
у кого какие идеи почему не отправляется запрос?
Ответить с цитированием
  #14 (permalink)  
Старый 27.11.2014, 23:33
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

Приложил 2 скрина браузера, может они что-то подскажут.


настораживает таймлайн запроса, 2 раза запускал, 2 раза таймлайн ровно 2 минуты. Непонятно с чъей стороны вызван таймаут, в ajax запросе указал таймаут 60000 миллисекунд, в nginx 600 секунд, в ноде тоже 600000 миллисекунд.

Последний раз редактировалось ascherbakov, 27.11.2014 в 23:49.
Ответить с цитированием
  #15 (permalink)  
Старый 03.12.2014, 01:12
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

Сообщение от danik.js Посмотреть сообщение
То есть запрос повисает в ожидании, пока не наступит таймаут?
Проблема значит на серваке. Видимо у тебя слишком доолго выполняется sql
слишком долго выполняется sql-запрос (около 4х минут).
как можно решить проблему?
для открытия коннекта и выполнения запроса использую модуль odbc
в документации ничего про таймауты на выполнения запроса не сказано.
пробовал задать таймаут в строке коннекта вот так:
var Connect = "Driver={SQL Server};Server=" + ip + ";Database=MyDB;UID=sa;PWD=password;command timeout=600000;";

не помогло.
это код обработчик ajax'а:
exports.result = function(req, res, curSessionId) {
    var params = new Params(
        req.param("IP"),
        req.param("CODE"),
        req.param("START"),
        req.param("END")
    );

 GetData(res, params, function(data) {
        SerializeToJSON(data, function(jsonData) {
            SendClient(res, jsonData);
        });
    });
}

 function GetData(res, params, callback) {
    var i = 0;
    var ip = params["p_IP"];
    var code = params["p_CODE"];
    var Start = params["p_START"];
    var End = params["p_END"];
    var tmpConnect = "Driver={SQL Server};Server=" + ip + ";Database=MyDB;UID=sa;PWD=password;command timeout=600000;";

    odbc.open(tmpConnect, function(err, tmpDB) {

        if (err) {
            return console.log("Error!\n" + err.message);
        }

        var SQL = "SELECT * FROM [dbo].[ufn_getJornalRealizNew]('" + Start + "', '" + End + "', '" + code + "')";

        tmpDB.query(SQL, function (err, rows, moreResultSets) {

            if (err) {
                return console.log("Error!\n" + err.message);
            }

            tmpDB.close();
            callback(rows);
        });
    });
 }

 function SerializeToJSON(data, callback) {
    var jsonData = JSON.stringify(data);
    console.log(SerializeToJSON);
    callback(jsonData);
 }

 function SendClient(res, jsonData) {
    console.log(SendClient);
    res.end(jsonData);
 }

 function Params(ip, code, Start, End) {
    this.p_IP = ip;
    this.p_CODE = code;
    this.p_START = Start;
    this.p_END = End;
 }


а вот код ajax ф-и на клиенте:
function QueryItem(ip, code, Start, End) {
        document.getElementById('btn').innerText = "Подождите...";
       //alert(ip + "@" + code + "@" + kad + "@" + Start + "@" + End);
        content = $.ajax({
            url: '/result',
            type: 'get',
            timeout: 600000,
            data: ({IP: ip, CODE: code, START: Start, END: End}),
            success: function(msg) {
                alert("Ответ от сервера получен!");
                SetTable(msg);
                document.getElementById('btn').innerText = "Сформировать"
            },
            error: onAjaxError
        }).responseText;
        return;
    }

var onAjaxError = function(xhr, status){
        //showLoading(false)
        var errinfo = { errcode: status };
        if (xhr.status != 200) {
            // может быть статус 200, а ошибка
            // из-за некорректного JSON
            errinfo.message = xhr.statusText;
        } else {
            errinfo.message = 'Некорректные данные с сервера';
        }
        onLoadError(errinfo);
}

var onLoadError = function(error) {
        var msg = "Ошибка "+error.errcode;
        if (error.message) msg = msg + ' :'+error.message;
        return alert(msg);
}

так вот если я захожу на сайт через nginx, то через 2 минуты после отправки ajax'а, получаю алерт "Ошибка error: Bad Gateway", а если захожу на сайт через localhost: port, т.е. минуя nginx, то получаю алерт "Ошибка error: error".
одновременно с этим в консоль выводится запись:
GET /result?IP=10.10.10.7&CODE=12&START=02.12.2013&END= 02.12.2014 200 120618ms
статус 200!!!
время выполнения хоть и указано 2 минуты +- пара секунд, но реально sql-запрос еще продолжает работать. Это становится ясно потому что еще через пару минут в туже консоль ниже выводятся записи
console.log("SerializeToJSON");
и
console.log("SendClient");
из соответствующих функций. Но к этому времени, возникает ощущение, что обратная связь с клиентом через объект res уже потеряна и в результате res.end(jsonData); уходит в никуда.
у кого есть какие мысли на этот счет? а то у меня уже голова пухнет, даже уже и не знаю куда еще копнуть и что проверить?
Если уменьшить время время выполнения sql-запроса и соответственно объем полученных данных, путем подбора аргументов запроса, то все работает.

Последний раз редактировалось ascherbakov, 03.12.2014 в 01:14.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправить, когда четко соберется массив vas88811 Events/DOM/Window 11 26.02.2014 21:55
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Через ajax отправить много данных из таблицы на сервер Heger jQuery 3 29.08.2012 18:51
Ответ конкретному клиенту fredwriter AJAX и COMET 2 18.04.2012 13:28
Ajax - JSON - не распознает пришедший ответ Майский Кот jQuery 1 14.05.2009 00:40