【问题标题】:Wait for axios API call to complete in Node/Express在 Node/Express 中等待 axios API 调用完成
【发布时间】:2020-12-17 03:30:42
【问题描述】:

我确信这段代码是一团糟,因为我从来没有使用过这样的 API 调用。我面临的问题是,在生产环境中,节点在渲染页面之前没有等待 axios 调用完成。

我在开发环境中运行它没有问题。

router.get('/:id', middleware.isLoggedIn, (req, res) => {
var perPage = 9
var page = req.params.page || 1
User.findById(req.params.id)
.populate({
    path : 'log',
    options : { 
        sort : { date : -1 },
        limit: 8,
        skip: (perPage * page) - perPage
    },
  }).exec((err, foundUser) => {
    if(err){
        req.flash('error', 'Something went wrong. User not found.');
        res.redirect('back');
    } else {
        Logbook.find({author: req.user.id}).countDocuments().exec((err, count) => {
            if (err) return next(err)
            axios.get('http://data.fcc.gov/api/license-view/basicSearch/getLicenses?searchValue=' + foundUser.username + '&format=json')
                .then(async response => {
                    var json = response.data;
                    if (json == undefined || json.Licenses == undefined || json.Licenses.License == undefined) {
                        if (err) {
                            console.log(err);
                        }
                        console.log('error1');
                        res.redirect('/profile/' + foundUser.id);
                    } else {
                        var data = json.Licenses;
                        var data2 = data.License;
                        var lic = [];
                        for (var i = 0; i < data2.length; i++) {
                            var lic = data2[i];
                        }
                        res.render('profile/index', {
                            user: foundUser,
                            json: lic,
                            current: page,
                            pages: Math.ceil(count / perPage),
                            logCount: count,
                        });
                    };
                })
                .catch(error => {
                    console.log(error);
                    res.redirect('/profile/' + foundUser.id);
                });
        });
    }
});

真诚感谢任何帮助!

【问题讨论】:

    标签: node.js express axios ejs


    【解决方案1】:

    您的 async 关键字出现在一个奇怪的位置,并且您没有使用 await 来指示该节点应该等待该操作的结果。

    一般来说,您将函数标记为async,并且在该异步块内,您可以await 异步操作的结果。

    async function asyncFunc() {
      try {
        const response = await axios.get("/some_url_endpoint");
        const data = await response.json();
        return data;
      } catch (error) {
        console.error(error);
      }
    }
    

    你的例子可以这样重写:

    async function searchLicenses(foundUser) {
      const { username, id } = foundUser;
      const url = `http://data.fcc.gov/api/license-view/basicSearch/getLicenses?searchValue=${username}&format=json`;
    
      try {
        const response = await axios.get(url); // node will wait for the response before continuing
        const json = response.data;
      
        if (json == undefined || json.Licenses == undefined || json.Licenses.License == undefined) {
          if (err) {
            console.log(err);
          }
          console.log('error1');
          res.redirect(`/profile/${id}`);
        } else {
          const data = json.Licenses;
          const data2 = data.License;
          const lic = [];
    
          for (var i = 0; i < data2.length; i++) {
            var lic = data2[i];
          }
    
          res.render('profile/index', {
            user: foundUser,
            json: lic,
            current: page,
            pages: Math.ceil(count / perPage),
            logCount: count,
          });
        };
      } catch (error) {
        console.log(error);
        res.redirect(`/profile/${id}`);
      }
    }
    
    router.get('/:id', middleware.isLoggedIn, (req, res) => {
      var perPage = 9
      var page = req.params.page || 1
    
      User.findById(req.params.id)
        .populate({
          path: 'log',
          options: {
            sort: { date: -1 },
            limit: 8,
            skip: (perPage * page) - perPage
          },
        })
        .exec((err, foundUser) => {
          if (err) {
            req.flash('error', 'Something went wrong. User not found.');
            res.redirect('back');
          } else {
            Logbook.find({ author: req.user.id }).countDocuments().exec((err, count) => {
              if (err) return next(err)
              searchLicenses(foundUser.username)
            });
          }
        });
    }
    
    

    【讨论】:

    • 成功了!非常感谢您的简洁回复。这很有帮助。我确实最终返回了一个回调并在函数调用中移动 res.render。
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2021-07-04
    • 2019-03-31
    • 2020-07-12
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多