【问题标题】:http response body always empty or undefinedhttp 响应正文始终为空或未定义
【发布时间】:2019-10-03 17:15:31
【问题描述】:

我正在从 docker 容器内的 nodejs 服务向另一个容器中的 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 OKerr 消息总是为空,这意味着它实际上建立了连接,但为什么它总是返回并为空响应正文?

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

【问题讨论】:

  • 你检查你的连接字符串了吗?尝试硬编码 container 值以进行测试并以这种方式发出请求。
  • 正如我在问题中所说,我在localhost:3080 上向容器外的邮递员提出了请求,它在容器内返回了所需的响应正文,我只能使用服务的名称作为主机

标签: javascript node.js docker express docker-compose


【解决方案1】:

您正在发送数据,res.send({ data: requests }),在任何请求完成之前,因为它们是异步的。

也许你可以使用 Promise - 像这样:

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

【讨论】:

  • 它在console.log(spares)上返回[ '{"data":[]}' ]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2014-08-13
  • 2016-03-27
  • 2020-07-23
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多