асинхронные разделенные запросы в nodejs и mongoose - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу запросить две разные вещи в mongodb, используя Mongoose и ajax асинхронно.

Вот код:

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 голосов
/ 04 сентября 2018

Еще одно улучшение, которое можно сделать, - запустить его параллельно, используя 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 })
})
0 голосов
/ 04 сентября 2018

Используя async/await, мы исключаем обратные вызовы и оставляем вызовы независимыми. Признак ошибки также можно упростить, поместив if с условиями отрицания.

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)
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...