首页 > 解决方案 > http 响应正文始终为空或未定义

问题描述

我正在从 docker 容器内的 nodejs 服务向另一个容器中的 api 使用request模块进行 get 调用,它们都由 docker-compose 管理,并且每次无论我尝试什么,响应正文始终为空或未定义.

当我与邮递员通话时,我得到了我想要的响应正文。

我在我的docker-compose.yamlso中定义了这两个服务,而不是使用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运行的端口上。30803088

关于它的奇怪之处在于状态代码始终为空200 OKerr消息始终为空,这意味着它实际上建立了连接,但为什么它总是返回并为空响应正文?

编辑:在对控制器进行沙箱处理并尝试从邮递员中的端点获取几乎任何东西之后,我发现在获取响应正文并将其发送后,res.send我收到一个空对象,就像text/html在邮递员中检查标头时一样,尽管它们被发送为application/json

标签: javascriptnode.jsdockerexpressdocker-compose

解决方案


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
      });
  });

推荐阅读