在nodejs和mongoose中异步分离查询

时间:2018-09-03 21:22:23

标签: node.js express mongoose

我想异步使用Mongoose和Ajax向mongodb查询两个不同的东西。

代码如下:

var teams, faculties;
userModel.find({}).sort('-score').exec((err, result) => {
        teams = result;
    });

    userModel.aggregate([{
        "$group": {
            _id: "$faculty",
            average: {
                $avg: "$score"
            }
        }
    }]).exec((err, result) => {
        faculties = result;
    });
res.render('/scoreboard', {
    information: [teams, faculties]
})

是否有更好的实现来处理查询以异步运行?

2 个答案:

答案 0 :(得分:1)

使用async/await,我们消除了回调,并使呼叫保持独立。如果具有否定条件,也可以通过放置错误特征来简化。

app.get('/myroute', async(req, res) => {
    try {
        const teams = await userModel.find({}).sort('-score')
        const faculties = await userModel.aggregate([{
            "$group": {
                _id: "$faculty",
                average: {
                    $avg: "$score"
                }
            }
        }])    
        res.render('/scoreboard', { information: [teams, faculties] })

    } catch (error) {
        res.status(400).send(error)
    }
})

答案 1 :(得分:0)

可以进行的另一项改进是使用Promise.all并行运行它,因为这些功能彼此独立。

app.get('/myroute', async(req, res) => { 
    const response = await Promise.all([
      userModel.find({}).sort('-score'),
      userModel.aggregate([{
          "$group": {
              _id: "$faculty",
              average: {
                  $avg: "$score"
              }
          }
      }])    
    ]); // response will return as [teams, faculties]
    res.render('/scoreboard', { information: response })
})