首页 > 解决方案 > 如何从节点 js 中的 mongodb 查询中获取变量?

问题描述

我想从 node.js 中的 mongodb 查询中获取一个变量,该变量将计算名为的集合中的文档数students

我试图在查询之前声明一个全局变量,并尝试在查询函数中分配值:

router.get('/dashboard', loggedin, function (req, res, next) {
// Student is a db object of a collection named students
var std_count

Student.find(function(err, doc) {
  if(err) console.log(err)
  else {
  std_count = doc.length
  }
})

console.log(std_count)

res.render('dashboard', {
  user:req.user
  })
});

console.log()总是打印undefined,但如果我把console.log()里面的else{}块,它打印正确的结果。

我需要再做 4 个这样的查询(比如教师、课程等)并将它们全部发送到res.render()

任何帮助,将不胜感激。

标签: javascriptnode.jsmongodb

解决方案


Mongoose通过链接到最后来.find回报承诺,.exec

router.get('/dashboard', loggedin, function (req, res, next) {

    // Student is a db object of a collection named students
    Student.find({})
    .exec()
    .then(data => {

        const std_count = data.length;
        res.render('dashboard', {
            user:req.user
        });
    })
    .catch(err => res.status(500));

});

更新:

然后您可以使用 await 每个查询并将它们最后发送到res.render.

router.get('/dashboard', loggedin, async function (req, res, next) {
    try {
        const std_count = (await Student.find({}).exec()).length || 0;
        const teachers_count = (await Teachers.find({}).exec()).length || 0;
        const courses_count = (await Courses.find({}).exec()).length || 0;

        return res.render('dashboard', { 
            user: req.user,
            studentCount: std_count,
            teacherCount: teachers_count,
            coursesCount: courses_count
        });

    } catch (err) {
        return res.status(500);
    }
});

推荐阅读