javascript - http 响应正文始终为空或未定义
问题描述
我正在从 docker 容器内的 nodejs 服务向另一个容器中的 api 使用request
模块进行 get 调用,它们都由 docker-compose 管理,并且每次无论我尝试什么,响应正文始终为空或未定义.
当我与邮递员通话时,我得到了我想要的响应正文。
我在我的docker-compose.yaml
so中定义了这两个服务,而不是使用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
解决方案
您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
});
});
推荐阅读
- javascript - 用于识别 javascript 函数的 Google Vision API
- swift - 我的 Swift 代码中似乎有一个无限的 while 循环,我不知道为什么
- java - javafx导入无法在eclipse中解决
- html - 搜索栏图标向下移动?
- azure-language-understanding - 如何支持动态增长的 BusinessEvents 列表
- html - 如何使弹性元素占据这些空间?
- docker - Keycloak docker容器无法发现彼此
- bison - Flex 和 Bison Parser,两个标记的相同字符
- pandas - 重命名列返回 str 对象没有属性“重命名”
- javascript - Firebase:保持用户登录角度 7