【发布时间】:2019-07-23 06:28:19
【问题描述】:
我在我的 nodejs 应用程序中使用 axios 向另一个服务发送请求。
当我发送请求并得到 5xx 或 4xx 错误代码作为响应时 - axios 会很好地处理请求并将错误返回给客户端。
当请求结构良好时,它只是挂起,并且 axios 发送的承诺永远不会解析,让客户端无限期地挂起等待响应。
我不知道是什么导致只有有效的请求挂起,或者如何进一步调试。
到目前为止我尝试过的事情 -
- 使用邮递员发送请求(失败和有效) - 它们按预期返回错误代码和 OK 代码。
- 在 VScode 中调试节点进程,我可以看到 axios 在内部无限循环,等待 promise 解决,但我还没有理解是什么让 promise 无法解决。
- axios 版本有点过时,所以我尝试更新它,但这产生了新问题,所以我决定将其拨回原始版本。
有关应用程序版本的一些信息,如果相关 -
- 节点版本 - v9.11.1
- axios 版本 - 0.9.1
axios 请求的片段,出于安全原因编辑 -
const Router = require('express').Router;
const router = Router();
const axios = require('axios').create({
baseURL: 'https://some-service.com'
});
const auth-handler = require('auth-handler');
router.post('/', (req, res) => {
auth-handler.getToken('token-name')
.then(token => {
const body = {
subject: "subject",
body: "body"
};
const options = {
headers: {
'Authorization': 'Bearer ' + token,
'Content-Type': 'application/json'
}
};
return axios.post('/'+req.body.route+'/endpoint?foo=bar', body, options);
})
.then(response => res.status(response.status).send(response.data))
.catch(error => {
console.error(error);
res.status(error.status).send(error.data);
});
});
【问题讨论】:
-
您确定要发布到其他服务吗?
axios.post('/'+req.body.route+'...也许你在同一个服务上发帖,并与你的快速路由器循环? -
我很肯定。正如您所见,当我定义 axios 时,其他服务是在 baseURL 中定义的,就像我写的那样 - 如果请求格式错误或无效,我将从其他服务获得预期的 4xx。
-
如果您可以控制其他服务,您是否尝试过记录请求的标头以发现 axios 调用和 postman 调用之间的差异?
-
我一直在努力避免它,因为其他服务是遗留服务并且对其的可见性不是很好,但我想是时候脱掉孩子的手套了。谢谢。
-
或者您可以设置一个间谍来监视您计算机上的传出请求。祝你好运!
标签: javascript node.js axios