axios post 请求挂在有效请求上

Posted

技术标签:

【中文标题】axios post 请求挂在有效请求上【英文标题】:axios post request hangs on valid requests 【发布时间】: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 调用之间的差异? 我一直在努力避免它,因为其他服务是遗留服务并且对其的可见性不是很好,但我想是时候脱掉孩子的手套了。谢谢。 或者您可以设置一个间谍来监视您计算机上的传出请求。祝你好运! 【参考方案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 响应的指示,现在一切都恢复正常了。

【讨论】:

你到底做了什么? 能否请您发布您的解决方案?

以上是关于axios post 请求挂在有效请求上的主要内容,如果未能解决你的问题,请参考以下文章

Angular http post 请求失败,但 axios 1 有效

axios post请求和JQuery $ .ajax请求都是在移动设备上返回403禁止错误

使用 Axios 发布请求的 JWT 授权

Cors Post 请求上的 Axios 网络错误,状态码为 200

Axios POST 请求不起作用

Axios Post 请求发送未定义