Как вернуть результаты Mongoose из метода поиска?

Все, что я могу найти для разрыва страницы с результатами мангуста, говорит, чтобы сделать это следующим образом:

users.find({}, function(err, docs){ res.render('profile/profile', { users: docs }); }); 

Как я могу вернуть результаты запроса, как это?

 var a_users = users.find({}); //non-working example 

Чтобы я мог опубликовать несколько страниц на странице?

как:

 /* non working example */ var a_users = users.find({}); var a_articles = articles.find({}); res.render('profile/profile', { users: a_users , articles: a_articles }); 

Это можно сделать?

6 Solutions collect form web for “Как вернуть результаты Mongoose из метода поиска?”

Вы пытаетесь заставить синхронную парадигму. Просто не работает. node.js является однопоточным, по большей части – при выполнении io выполняется контекст выполнения. Сигнализация управляется обратным вызовом. Это означает, что вы либо имеете вложенные обратные вызовы, именованные функции, либо библиотеку управления streamом, чтобы сделать вещи более привлекательными.

https://github.com/caolan/async#parallel

 async.parallel([ function(cb){ users.find({}, cb); }, function(cb){ articles.find({}, cb); } ], function(results){ // results contains both users and articles }); 

Здесь я буду играть некроманта, поскольку я все еще вижу другой, лучший способ сделать это.

Используя замечательную библиотеку обещаний Bluebird и ее promisifyAll() :

 var Promise = require('bluebird'); var mongoose = require('mongoose'); Promise.promisifyAll(mongoose); // key part - promisification var users, articles; // load mongoose models "users" and "articles" here Promise.props({ users: users.find().execAsync(), articles: articles.find().execAsync() }) .then(function(results) { res.render('profile/profile', results); }) .catch(function(err) { res.send(500); // oops - we're even handling errors! }); 

Основные части:

 Promise.promisifyAll(mongoose); 

Делает все методы мангуста (и его моделей) доступными как функции, возвращающие обещания, с суффиксом Async ( .exec() становится .execAsync() и т. Д.). .promisifyAll() почти универсален в мире Node.JS – вы можете использовать его на всех, предоставляющих асинхронные функции, принимающие обратный вызов в качестве последнего аргумента.

 Promise.props({ users: users.find().execAsync(), articles: articles.find().execAsync() }) 

.props() Метод .props() принимает объект с обещаниями как свои свойства и возвращает коллективные обещания, которые разрешаются, когда оба запроса базы данных (здесь – обещания) возвращают свои результаты. Решенное значение – это наш объект results в конечной функции:

  • results.users – пользователи, находящиеся в базе данных mongoose
  • results.articles – статьи, найденные в базе данных mongoose (d’uh)

Как вы можете видеть, мы даже не приближаемся к адскому обратному аду. Оба запроса базы данных выполняются параллельно – нет необходимости, чтобы один из них ожидал другого. Код короткий и читаемый – практически соответствует по длине и сложности (или, скорее, его отсутствию) желаемому «нерабочимому примеру», размещенному в самом вопросе.

Обещания – это круто. Используй их.

Простой способ:

 var userModel = mongoose.model('users'); var articleModel = mongoose.model('articles'); userModel.find({}, function (err, db_users) { if(err) {/*error!!!*/} articleModel.find({}, function (err, db_articles) { if(err) {/*error!!!*/} res.render('profile/profile', { users: db_users, articles: db_articles }); }); }); 

Практически каждая функция асинхронна в Node.js. Так что найти Монгуоса. И если вы хотите называть это серийно, вы должны использовать что-то вроде библиотеки слайдов .

Но в вашем случае я думаю, что самый простой способ – установить ответные вызовы (это позволяет задавать статьи для выбранных ранее пользователей) или делать это полностью параллельно с помощью асинхронных библиотек (см. Управление streamом / Асинхронные лакомства ).

У меня есть функция, которую я использую совсем как возврат к функциям узла.

 function freturn (value, callback){ if(callback){ return callback(value); } return value; }; 

Затем у меня есть необязательный параметр обратного вызова во всех подписях.

Я имел дело с очень похожими вещами, но с использованием доступа socket.io и DB к клиенту. Моя находка бросала содержимое моего БД обратно клиенту, прежде чем firebase database имела возможность получить данные … Итак, для чего это стоит, я поделюсь своими выводами здесь:

Моя функция для получения БД:

// Чтение плат – полная БД

 var readBoards = function() { var callback = function() { return function(error, data) { if(error) { console.log("Error: " + error); } console.log("Boards from Server (fct): " + data); } }; return boards.find({}, callback()); }; 

Мой прослушиватель событий сокета:

 socket.on('getBoards', function() { var query = dbConnection.readBoards(); var promise = query.exec(); promise.addBack(function (err, boards) { if(err) console.log("Error: " + err); socket.emit('onGetBoards', boards); }); }); 

Поэтому для решения проблемы мы используем promise, которое дает нам мангуста, а затем, как только мы получили данные из БД, мой сокет выдает его обратно клиенту …

Для чего это стоит …

Вы получаете желаемый результат по следующему коду. Надеюсь, что это поможет вам.

 var async = require('async'); // custom imports var User = require('../models/user'); var Article = require('../models/article'); var List1Objects = User.find({}); var List2Objects = Article.find({}); var resourcesStack = { usersList: List1Objects.exec.bind(List1Objects), articlesList: List2Objects.exec.bind(List2Objects), }; async.parallel(resourcesStack, function (error, resultSet){ if (error) { res.status(500).send(error); return; } res.render('home', resultSet); }); 
  • Получить имя хоста текущего запроса в node.js Express
  • Индексирование Mongoose в производственном коде
  • Как разобрать HTML-страницу с помощью Node.js
  • Основной статический файловый сервер в NodeJS
  • библиотеки аутентификации пользователей для node.js?
  • Использование MemoryStore в производстве
  • Зачем использовать AJAX, когда доступны WebSockets?
  • RabbitMQ / AMQP: одиночная очередь, несколько потребителей для одного сообщения?
  • Express-js не может получить мои статические файлы, почему?
  • Идиоматический способ ожидания множественных обратных вызовов в Node.js
  • Как создать глобальные переменные, доступные во всех представлениях, используя Express / Node.JS?
  • Interesting Posts

    Создание экземпляра конструктора с параметрами во внутреннем classе с reflectionм

    Чтение iphone app sms

    Ubuntu 10.04 сломал панель поиска ctrl ctrl ctrl ctrl

    jQuery откладывает и обещает – .then () vs .done ()

    Почему значения даты / времени неверно интерпретируются при исправлении / сохранении?

    CMake: Как установить LDFLAGS в CMakeLists.txt?

    Функция «отменить отправку» Thunderbird (как в Gmail)?

    Создание Qt5 с Visual Studio 2012 / Visual Studio 2013 и интеграция с IDE

    Требуется ли каждой ОС оперативная память?

    Объект 4.1 Обновление существующего родительского объекта с новыми дочерними объектами

    Откройте изображение с помощью URI в средстве просмотра изображений галереи по умолчанию в Android

    Ошибка установки Intel HAXM. Этот компьютер не поддерживает технологию Intel Virtualization Technology (VT-x)

    Как конвертировать Bluetooth-ключ беспроводной клавиатуры в качестве универсального Bluetooth-ключа?

    Как установить AUTO-SCROLLING JTextArea в Java GUI?

    Не удалось добавить окно android.view.ViewRoot$W@44da9bc0 – разрешено разрешение для этого типа windows

    Давайте будем гением компьютера.