@de1m

Как дождаться конца request?

У меня есть вот такая функция:
icingaapi.prototype.getHostFiltered = function (filter, callback) {
    var self = this;
    var options = {
        hostname: self.url,
        port: self.port,
        path: '/v1/objects/hosts/',
        method: 'POST',
        rejectUnauthorized: false,
        auth: self.user + ":" + self.pass,
        headers: {
            "Accept": "application/json",
            "Content-Type": "applicatoin/json"
        }
    }
    var req = https.request(options, (res) => {
        res.on('data', (d) => {
            if (res.statusCode == "200") {
              console.log("DATA: " + d);
              var output = JSON.parse(d);

              return callback(null, output.results);
            } else {
                return callback({
                    "Statuscode": res.statusCode,
                    "StatusMessage": res.statusMessage
                }, null);
            }
        });
        res.on('end', function(){
          console.log("Res end###################");
        })
    });

    req.write(JSON.stringify(filter));
    req.end();

    req.on('error', (e) => {
        return callback(e, null);
    });
}


Проблема в том, что "ответ" приходит не полным, я так думаю, что соеденение "req.end();" закрывается быстрее, чем приходят все данные. Если к примеру данных мало, то всё работает нормально.
Можно как-то дождаться пока всё придёт и потом только вызвать "req.end();"?

Я попытался сделать,
res.on('end', function(){
          req.end();
        })

но "req.end();" одновременно и стартует это всё. Кто может подсказать как надо правильно сделать?
  • Вопрос задан
  • 416 просмотров
Решения вопроса 1
@de1m Автор вопроса
Проблему я решил.
Выгдлядит это теперь вот так:
var req = https.request(options, function(res){
      res.on('data', function(chunk){
        resData += chunk;
      })
      res.on('end', function(){
        if (res.statusCode == "200") {
          var output = JSON.parse(resData);
          return callback(null, output.results);
        } else {
          return callback({
            "Statuscode": res.statusCode,
            "StatusMessage": res.statusMessage
          }, null);
        }
      })
    });
    req.end(JSON.stringify(filter));


Опции и верхнюю часть в целом я не стал добавлять.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
severus256
@severus256
Code everywhere....
Вам нужно как-то насимулировать взаимодействие с сервером, пока не придут все данные. Можно попробовать http-статусами. Например, пока данные в обработке, сервер посылает статус 100 с определенными интервалами. Когда данные пришли и процесс завершен, то получаете статус 101 и закрываете соединение.
Ответ написан
@vshvydky
на сколько я понимаю, вы выводите ответ через write(), эта функция работает в асинхронном режиме, и соответственно выполнение кода за ней не ждет ее завершения. А end() завершает любые выдачи пользователю и ваши данные вываливаются вникуда.
request.write (фрагмент [, кодирование] [, обратный вызов]) из доки к ноде, обратите внимание на возможность использоватия колбекка.
А так же почему бы не отдавать махомм все данные через end?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы