【问题标题】:Some axios.get requests fail with "Request failed with status code 404"一些 axios.get 请求失败并显示“请求失败,状态码 404”
【发布时间】:2020-08-04 13:54:08
【问题描述】:

所以我正在使用 Nodejs 并有一条快速路线,如下所示:

app.get('/approvedmr/:id', async (req, res) => {    
    try {
        const projectid = parseInt(req.params.id, 10);
        const apMR = await new MergeRequestApproval().getResponse(projectid, 'Any');
        res.send(await new MergeRequestApproval().getHeader(apMR, 'Any'));
    } catch {
        res.sendStatus(404);
    }
});

这是getResponse函数:

    async getResponse(id: number, approval: string) {
        const axiosInstance = axios.create();
        return await axiosInstance.get(`gitlaburl/api/v4/projects/${id}/merge_requests?approved_by_ids=${approval}&per_page=1`, defaultheader);
        }

我在getResponse 中省略了一些部分,因为它们只检查approval-String 是否包含某个字符串。

现在。在本地一切正常,一旦我将它的 dockerized 版本部署到测试服务器,这些 id 将适用于 [1;99],如果 id 大于 100 或 330,它将返回如下错误:

这是error.stack:

"Error: Request failed with status code 404\n    
at createError (/node_modules/axios/lib/core/createError.js:16:15)\n    
at settle (/node_modules/axios/lib/core/settle.js:17:12)\n    
at IncomingMessage.handleStreamEnd (/node_modules/axios/lib/adapters/http.js:236:11)\n    
at IncomingMessage.emit (events.js:205:15)\n    
at endReadableNT (_stream_readable.js:1154:12)\n    
at processTicksAndRejections (internal/process/task_queues.js:84:9)"

我最初使用 axios.get 而不是 axios.create().get,但后来读到这可能会导致问题,但事实并非如此。

任何想法将不胜感激!

谢谢!

【问题讨论】:

    标签: node.js typescript axios


    【解决方案1】:

    我本身无法确定问题。 MergeRequestApproval().getHeader 函数很可能抛出未解决的错误。另一个原因可能是您实际上没有一个 id 高于 99 的项目 但是我认为您可以重组部分代码。我会采用getResponse,它正在返回 gitlab 的响应(作为 axios 响应)并在您的快速服务器中转发响应而不发生突变。

    app.get('/approvedmr/:id', async (req, res) => {    
        const projectid = parseInt(req.params.id, 10);
        const apMR = await new MergeRequestApproval().getResponse(projectid, 'Any');
        res.json(apMR);
    });
    

    ApMR 包含您的HTTP 请求 的响应data and header请注意,为了方便起见,我使用了res.jsonres.send 一样好,但不包括内容类型 JSON 的响应标头。

    如果您想明确返回 404 以防找不到任何项目,您可以坚持使用 axios's error response status。 例如

    res.sendStatus(apMR.response.status);

    将它们拼接在一起,您可以像这样构建您的端点:

    app.get('/approvedmr/:id', async (req, res) => {   
        try { 
            const projectid = parseInt(req.params.id, 10);
            const apMR = await new MergeRequestApproval().getResponse(projectid, 'Any');
            res.json(apMR);
        catch (e) {
             if (e.response) {
                 res.sendStatus(apMR.response.status);
             }
             // You might want to extend your error handling here.
             // what about service outage (of gitlabs API), network issues, invalide auth etc.
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 2020-09-18
      • 2021-04-10
      • 2019-10-12
      • 2023-01-21
      • 1970-01-01
      • 2022-11-13
      • 2021-06-29
      相关资源
      最近更新 更多