Показать сообщение отдельно
  #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.
Ответить с цитированием