Выполнение последовательных вызовов axios post API с правильной обработкой ошибок

#node.js #express #async-await #axios

#node.js #экспресс #асинхронное ожидание #axios

Вопрос:

Мне нужно написать API, который будет вызывать один POST API и передавать полученные от него данные в другой POST API, а затем возвращать данные из второго API пользователю.

Также должна быть выполнена надлежащая обработка ошибок, чтобы API возвращал сообщение об ошибке и не выходил из строя, когда один из API не работает

Код, который я пробовал, выглядит следующим образом

 listPopularPost: async(req, res) => {
    let requestUrl = process.env.USER_SERVICE_URL "/api/" process.env.API_VERSION '/story-popular';
    try{
        await axios.post(requestUrl, req.body, requestHeader).then((response) => {
            if(response.data.success == true){
                let cmsRequestUrl = process.env.CMS_SERVICE_URL process.env.API_VERSION "/story/popular";
                let requestParam = {
                    "request" : req.body,
                    "user_params": response.data.story_ids,
                }
                axios.post(cmsRequestUrl, requestParam,requestHeader).then((response) => {
                    res.status(200).send(response.data);
                }, (error) => {
                    res.status(200).send({'success':false,'code':'request_error','message':'error encountered','data':{'error':error}});
                });
            }
        }, (error) => {
            res.status(200).send(error);
        });
    }
    catch(err){
        console.log(err)
        res.status(500).send(err);
    } 
},
  

Но это тайм-аут и не работает. Как я могу исправить этот код?

Ответ №1:

Поскольку вы используете async / await. Вы могли бы провести рефакторинг как

 listPopularPost: async (req, res) => {
  let requestUrl = process.env.USER_SERVICE_URL   "/api/"   process.env.API_VERSION   '/story-popular';
  try {
    let data = await axios.post(requestUrl, req.body, requestHeader).then((response) => response.data);
    if (data.success) {
      let cmsRequestUrl = process.env.CMS_SERVICE_URL   process.env.API_VERSION   "/story/popular";
      let requestParam = {
        "request": req.body,
        "user_params": data.story_ids,
      }
      data = await axios.post(cmsRequestUrl, requestParam, requestHeader).then((response) => response.data);
      return res.status(200).send(data);
    }

    return res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': new Error("Request wasn't successful") } });
  }
  catch (err) {
    console.log(err)
    res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': error } });
  }
}  

или без использования async / await

 listPopularPost: (req, res) => {
  let requestUrl = process.env.USER_SERVICE_URL   "/api/"   process.env.API_VERSION   '/story-popular';

  axios.post(requestUrl, req.body, requestHeader).then((response) => response.data)
    .then((data) => {
      if (!data.success) throw new Error("Request was unsuccessful");

      let cmsRequestUrl = process.env.CMS_SERVICE_URL   process.env.API_VERSION   "/story/popular";
      let requestParam = {
        "request": req.body,
        "user_params": data.story_ids,
      }
      return axios.post(cmsRequestUrl, requestParam, requestHeader);
    })
    .then(response => response.data)
    .then(data => res.status(200).send(data))
    .catch(err => {
      console.log(err)
      res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': error } });
    });
}  

Комментарии:

1. Вы уверены, что это значение response.data.story_ids будет передано, а не перезаписано?

2. да, вы правы @SaeeshTendulkar. Я только что отредактировал его.

3. Я попробовал использовать async / await, и по какой-то причине он переходит к блоку catch

4. да, он перейдет к блоку catch, если в каком-либо из обещаний будет выдана ошибка

5. Но я попробовал отдельные API, и они оба работают. Как мне это отладить?