Тело ответа http всегда пустое или неопределенное - PullRequest
0 голосов
/ 03 октября 2019

Я делаю вызов get из службы nodejs внутри контейнера Docker для API в другом контейнере с модулем request, все они управляются с помощью docker-compose, и каждый раз, независимо от того, что я пробую в теле ответавсегда либо пусто, либо неопределенно.

когда я звоню почтальону, я получаю тело ответа, которое хочу.

У меня есть два сервиса, определенных в моем docker-compose.yaml, поэтому вместо использованияlocalhost и номер порта. Я использую имя сервиса в качестве хоста.

вот вызов:

 Request.find({$and : [{status : 'Delivered'},
    {pickup : req.params.location}]})
    .then(requests => {
        var resultRequests = requests.forEach( (request) => {
            request.get('http://spare_web:3080/spares/warehouse/'+request.spareSerial, function(err, response, body) {
                console.log(response.statusCode); // 200
                console.log(response.headers['content-type']); // 'application/json'
                console.log(body);//it returns '{"data":[]}' and when i change it to body[0] it returns '{'
                console.log(err);
              });



        })

        res.send({data : requests});
    })

, а вот API:

exports.findBySerial = (req, res) => {
    Spare.find({serial : req.params.serial })
    .then(spares => {
        res.send(spares);
    }).catch(err => {
        res.status(500).send({
            message: err.message || "Some error occurred while retrieving spares."
        });
    });
};

обратите внимание, что имя службы API - spare_web, и он работает на порту3080 первая служба работает на 3088.

, странная вещь в том, что код состояния всегда 200 OK, а сообщение err всегда пустое, что означает, что оно фактически делаетсоединение, но почему оно всегда возвращает пустое тело ответа?

РЕДАКТИРОВАТЬ: после песочницы контроллера и попытки получить что-нибудь из конечной точки в почтовом модуле, я обнаружил, что после получения тела ответа и отправки его сres.send я получаю пустой объект как text/html после проверки заголовков в почтальоне, хотя они отправляются как application/json

1 Ответ

2 голосов
/ 03 октября 2019

Вы отправляете данные, res.send({ data: requests }), до завершения любого из запросов, поскольку они асинхронные.

Возможно, вы могли бы использовать обещания - что-то вроде этого:

Request
  .find({ $and: [{ status: 'Delivered' }, { pickup: req.params.location }]})
  .then(docs => {
    var promises = docs
      .map(doc => {
        return new Promise((resolve, reject) => {
          request.get('http://spare_web:3080/spares/warehouse/' + doc.spareSerial, function(err, response, body) {
            if (err) reject(err);
            resolve(body);
          });
        });
      });

    Promise.all(promises)
      .then(spares => {
        console.log(spares)

        // Do something with spares
        res.send({ data: ... });
      })
      .catch(err => {
        // Handle error
      });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...