Model.find (). ToArray () afirma no tener el método .toArray ()

Soy muy nuevo en nodejs y mongodb y estoy tratando de armar mi propia aplicación de blogs. Tengo un problema al intentar consultar a través de mi modelo de ‘Blog’ para los que tienen un nombre de usuario específico. Cuando bash correr

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

Me sale un error

 TypeError: Object # has no method 'toArray' 

Sé que los globales son malos, pero he estado tratando de hacer que funcione. La documentación de Mongo afirma que se devuelve un cursor que puede tener el método toArray () invocado. No tengo idea de por qué no va a funcionar. Aquí está mi creación de esquema / modelo:

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

Estas son las solicitudes / login y / 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('/'); }); 

El resultado final se supone que funciona con este Jade:

 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 

¿Cómo puedo obtener la consulta para generar una matriz, o incluso trabajar como un objeto?

La función toArray existe en la clase Cursor del controlador Native MongoDB NodeJS ( referencia ). El método find en MongooseJS devuelve un objeto Query ( referencia ). Hay algunas maneras en que puede hacer búsquedas y devolver resultados.

Como no hay llamadas sincrónicas en el controlador NodeJS para MongoDB, deberá usar un patrón asíncrono en todos los casos. Los ejemplos de MongoDB, que a menudo están en JavaScript utilizando la Consola MongoDB, implican que el controlador nativo también admite funcionalidades similares, lo que no es así.

 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); }); }; 

Entonces, para llamarlo:

 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('/'); }); 

También puede hacer la clasificación en un campo (como la fecha de publicación de un blog, por ejemplo):

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

El código anterior se ordenaría en orden descendente según un campo llamado postDate (syntax alternativa: sort({ postDate: -1}) .

Deberías utilizar la callback de find:

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

Ahora puede obtener sus blogs llamando a esta función:

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

Pruebe algo como:

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