首页 > 解决方案 > 使用适当的错误处理进行连续的 axios post API 调用

问题描述

我需要编写一个 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);
    } 
},

但它超时并且不起作用。如何修复此代码?

标签: node.jsexpressasync-awaitaxios

解决方案


由于您使用的是异步/等待。你可以重构为

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


推荐阅读