Model.find()。toArray()声明不具有.toArray()方法

我对nodejs和mongodb非常陌生,并且试图拼凑我自己的博客应用程序。 我有一个问题,试图通过我的“博客”模式查询具有特定用户名的。 当我尝试跑步

var userBlogs = function(username) { ub = Blog.find({author: username}).toArray(); ub = ub.reverse(); }; 

我得到一个错误。

 TypeError: Object #<Query> has no method 'toArray' 

我知道globals是坏的,但我一直在努力让它工作。 Mongo文档声明返回一个游标,它可以调用toArray()方法。 我不知道为什么它不起作用。 这是我的模式/模型创build:

 var blogSchema = mongoose.Schema({ title: {type:String, required: true}, author: String, content: {type:String, required: true}, timestamp: String }); var Blog = mongoose.model('Blog', blogSchema); 

这里是/ login和/ readblog请求

 app.get('/readblog', ensureAuthenticated, function(req, res) { res.render('readblog', {user: req.user, blogs: ub}) }) app.get('/login', function(req, res){ res.render('login', { user: req.user, message: req.session.messages }); }); app.post('/login', passport.authenticate('local', { failureRedirect: '/login'}), function(req, res) { userBlogs(req.user.username); res.redirect('/'); }); 

最终的结果是应该与这个玉器:

 extends layout block content if blogs for blog in blogs h2= blog[title] h4= blog[author] p= blog[content] h4= blog[timestamp] a(href="/writeblog") Write a new blog 

我怎样才能得到查询输出数组,甚至作为一个对象工作?

toArray函数存在于Native MongoDB NodeJS驱动程序( reference )的Cursor类中。 MongooseJS中的find方法返回一个Query对象( 引用 )。 有几种方法可以进行search并返回结果。

由于NodeJS驱动程序中没有针对MongoDB的同步调用,因此在所有情况下都需要使用asynchronous模式。 MongoDB的例子,通常在JavaScript中使用MongoDB控制台,这意味着本地驱动程序也支持类似的function,而不是。

 var userBlogs = function(username, callback) { Blog.find().where("author", username). exec(function(err, blogs) { // docs contains an array of MongooseJS Documents // so you can return that... // reverse does an in-place modification, so there's no reason // to assign to something else ... blogs.reverse(); callback(err, blogs); }); }; 

然后,调用它:

 userBlogs(req.user.username, function(err, blogs) { if (err) { /* panic! there was an error fetching the list of blogs */ return; } // do something with the blogs here ... res.redirect('/'); }); 

你也可以在字段上进行sorting(例如,博客文章date):

 Blog.find().where("author", username). sort("-postDate").exec(/* your callback function */); 

上面的代码将根据名为postDate的字段降序排列(替代语法: sort({ postDate: -1})

你应该利用find的callback:

 var userBlogs = function(username, next) { Blog.find({author: username}, function(err, blogs) { if (err) { ... } else { next(blogs) } }) } 

现在你可以让你的博客调用这个函数:

 userBlogs(username, function(blogs) { ... }) 

尝试一下:

 Blog.find({}).lean().exec(function (err, blogs) { // ... do something awesome... }