Model.find (). ToArray () afirmando não ter o método .toArray ()

Eu sou muito novo para nodejs e mongodb e estou tentando juntar meu próprio aplicativo de blogging. Eu tenho um problema ao tentar consultar através do meu modelo ‘Blog’ para aqueles com um nome de usuário específico. Quando tento correr

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

Eu recebo um erro.

 TypeError: Object # has no method 'toArray' 

Eu sei que globals são ruins, mas eu tenho tentado fazer isso funcionar. A documentação do Mongo afirma que um cursor é retornado, o qual pode ter o método toArray () chamado nele. Eu não tenho idéia porque não vai funcionar. Aqui está minha criação 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); 

Aqui estão as solicitações / login e / 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('/'); }); 

O resultado final deve funcionar com 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 

Como posso obter a consulta para gerar uma matriz ou até mesmo trabalhar como um object?

A function toArray existe na class Cursor do driver Native NodeJS do MongoDB ( referência ). O método find no MongooseJS retorna um object Query ( referência ). Existem algumas maneiras de pesquisar e retornar resultados.

Como não há chamadas síncronas no driver NodeJS para o MongoDB, você precisará usar um padrão asynchronous em todos os casos. Exemplos do MongoDB, que geralmente estão em JavaScript usando o MongoDB Console, indicam que o driver nativo também suporta funcionalidades semelhantes, o que não acontece.

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

Então, para chamá-lo:

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

Você também pode fazer uma sorting em um campo (como uma data de postagem do blog, por exemplo):

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

O código acima classificaria em ordem decrescente com base em um campo chamado postDate (syntax alternativa: sort({ postDate: -1}) .

Você deve utilizar o retorno de chamada de encontrar:

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

Agora você pode obter seus blogs chamando esta function:

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

Tente algo ao longo das linhas de:

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