【问题标题】:axios post request hangs on valid requestsaxios post 请求挂在有效请求上
【发布时间】: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


【解决方案1】:

面临类似的问题。 Axios 会卡在实例(请求)步骤中。将 URL 中的 https 替换为 http 解决了该问题。

【讨论】:

    【解决方案2】:

    对我来说,使用 https://www.npmjs.com/package/axios-request-throttle 后它起作用了

    static myFynction(urls): void {
        axiosThrottle.use(axios, {
            requestsPerSecond: 2
        });
        const getUrls = [];
        urls.forEach((url: string) => {
        const axiosCall = axios({
                method: 'GET',
                headers: {
                    ...
                },
                url: url,
            })
            .then((response) => {
                return response.status;
            })
            .catch((error) => {
                return error.message;
            });
        getUrls.push(axiosCall);
    });
    const responses = browser.call(async () => await Promise.all(getUrls));
    }
    

    【讨论】:

    • 感谢 sn-p。就像我说的那样 - 在我的案例中,这最终成为处理 axios 响应的代码的问题。很高兴知道您也找到了解决方案。
    【解决方案3】:

    这个问题的答案是 axios 已经按预期解决了 Promise,在我的程序的客户端没有任何迹象,只有错误在表单中正确显示。

    我添加了 2xx 响应的指示,现在一切都恢复正常了。

    【讨论】:

    • 你到底做了什么?
    • 能否请您发布您的解决方案?
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2018-04-23
    • 2021-02-04
    • 2020-12-15
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多