Model.find (). ToArray () утверждает, что не имеет метода .toArray ()

Я очень новичок в nodejs и mongodb, и я пытаюсь собрать свое собственное приложение для ведения блога. У меня возникла проблема с запросом в моей модели «Блог» для тех, у кого есть конкретное имя пользователя. Когда я пытаюсь запустить

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

Я получаю сообщение об ошибке.

 TypeError: Object # has no method 'toArray' 

Я знаю, что глобальные перемены плохи, но я просто пытался заставить его работать. Документация Mongo утверждает, что курсор возвращается, который может вызвать метод toArray (). Я понятия не имею, почему это не сработает. Вот мое создание схемы / модели:

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

Конечный результат должен работать с этим 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 

Как я могу получить запрос для вывода массива или даже работать как объект?

    3 Solutions collect form web for “Model.find (). ToArray () утверждает, что не имеет метода .toArray ()”

    Функция toArray существует в classе Cursor из драйвера Native MongoDB NodeJS ( ссылка ). Метод find в MongooseJS возвращает объект Query ( referenc e). Существует несколько способов поиска и возврата результатов.

    Поскольку в драйвере NodeJS для MongoDB нет синхронных вызовов, во всех случаях вам необходимо использовать asynchronous шаблон. Примеры MongoDB, которые часто используются в JavaScript с помощью консоли MongoDB, подразумевают, что родной драйвер также поддерживает аналогичные функции, чего нет.

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

    Вы также можете выполнять сортировку по полю (например, например, запись в блоге):

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

    Вышеприведенный код сортировался в порядке убывания на основе поля, называемого postDate (альтернативный синтаксис: sort({ postDate: -1}) .

    Вы должны использовать обратный вызов find:

     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... } 
    Давайте будем гением компьютера.