某些axios.get请求失败,出现“请求失败,状态码为404”

时间:2020-08-04 13:54:08

标签: node.js typescript axios

所以我正在使用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中的某些部分,因为它们仅检查批准字符串是否包含某个字符串。

现在。在本地,一切正常,将我的dockerized版本部署到测试服务器后,这些ID即可使用[1; 99],如果该ID大于此值(例如100或330),则会返回如下错误:

这是错误。堆栈:

"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,但后来读到这可能会导致问题,但是没有。

任何想法将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

我本身无法确定问题。 MergeRequestApproval().getHeader函数很可能引发了未解决的错误。另一个原因可能是您实际上没有ID高于99的项目 但是我认为您可以重组部分代码。我将使用getResponse来返回gitlab的Response(作为axios响应)并转发该响​​应,而不会在您的Express服务器中进行更改。

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.
    }
});