如何在Mongoose中正确获取MongoDB集合的所有文档?
问题原因与解决方案
为什么会拿到Query对象?
Mongoose的BlogPost.find()方法有两种使用逻辑:
- 当你传入回调函数时,Mongoose会自动触发查询,并把最终结果通过回调的第二个参数返回,这就是你第一段代码能拿到正确文章列表的原因。
- 当你直接把
find()的返回值赋值给变量时,得到的是Mongoose的Query对象——这是一个查询构造器,用来帮你链式添加查询规则(比如.sort()、.limit()),它本身不是查询结果,必须手动触发执行才能拿到数据。
你的第二段代码里,var AllPosts = BlogPost.find(...)赋值的就是这个未执行的Query对象,所以console.log输出的是查询相关的内部结构,而非你需要的文章数据。
正确的写法
写法1:继续用回调函数(适合简单场景)
如果要把数据传给EJS模板,直接在回调里处理结果:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/blog', {useNewUrlParser: true}); const Schema = mongoose.Schema; const BlogSchema = new Schema({ title : String, image: String, body: String }); const BlogPost = mongoose.model('posts', BlogSchema); // 以Express路由为例,把数据传给EJS模板渲染 app.get('/', (req, res) => { BlogPost.find((err, posts) => { if (err) { console.error(err); return res.send('查询出错'); } res.render('blog', { allPosts: posts }); }); });
写法2:用Async/Await(更清晰的现代写法)
Mongoose的Query对象支持Promise规范,所以可以用await等待查询完成,代码结构更直观:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/blog', {useNewUrlParser: true}); const Schema = mongoose.Schema; const BlogSchema = new Schema({ title : String, image: String, body: String }); const BlogPost = mongoose.model('posts', BlogSchema); // 注意:await必须在async标记的函数内使用 app.get('/', async (req, res) => { try { const allPosts = await BlogPost.find(); // 等待查询完成,直接拿到结果 res.render('blog', { allPosts: allPosts }); } catch (err) { console.error(err); res.status(500).send('服务器错误'); } });
写法3:用Promise链式调用
如果不想用async/await,也可以直接用Promise的.then()语法:
BlogPost.find() .then(posts => { console.log(posts); res.render('blog', { allPosts: posts }); }) .catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者Concentravity
相关产品推荐
相关产品推荐

