Некоторые запросы ax ios .get завершаются неудачно с сообщением «Запрос не выполнен с кодом состояния 404» - PullRequest
0 голосов
/ 04 августа 2020

, поэтому я использую Nodejs и имею маршрут express, который выглядит так:

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, поскольку они только проверяют, содержит ли строка утверждения определенную строку.

Теперь. Локально все работает нормально, как только я развертываю докерированную версию этого на тестовом сервере, эти идентификаторы работают для [1; 99], если идентификатор больше этого, скажем, 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 Ответ

1 голос
/ 04 августа 2020

Я не могу определить проблему как таковую. Скорее всего, функция MergeRequestApproval().getHeader выдает неразрешенную ошибку. Другая причина может заключаться в том, что у вас на самом деле нет проекта с идентификатором выше, чем 99. Однако я думаю, вы можете реструктурировать части своего кода. Я бы взял getResponse, который возвращает ответ gitlab (как ответ ax ios), и отправил бы ответ без изменений на ваш 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 включает ответ data и заголовок вашего HTTP-запроса . Обратите внимание, что для удобства я использовал res.json. res.send также хорошо, но без заголовков ответов для типа контента JSON.

Если вы хотите явно вернуть 404, если элемент не был найден, вы можете придерживаться ax Статус ответа об ошибке ios . например,

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