【发布时间】: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 OK 而err 消息总是为空,这意味着它实际上建立了连接,但为什么它总是返回并为空响应正文?
编辑:在对控制器进行沙箱处理并尝试从 post man 中的端点获取任何东西之后,我发现在获取响应正文并使用res.send 发送它之后,我在检查时收到一个空对象text/html邮递员中的标头,尽管它们是以application/json 发送的
【问题讨论】:
-
你检查你的连接字符串了吗?尝试硬编码
container值以进行测试并以这种方式发出请求。 -
正如我在问题中所说,我在
localhost:3080上向容器外的邮递员提出了请求,它在容器内返回了所需的响应正文,我只能使用服务的名称作为主机
标签: javascript node.js docker express docker-compose