Как вернуть результаты 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 }); 

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

Вы пытаетесь заставить синхронную парадигму. Просто не работает. 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); }); 
  • ошибка получения: «Ошибка: ошибка SSL: SELF_SIGNED_CERT_IN_CHAIN» при использовании npm
  • Команды npm не работают на WSL с zsh
  • Как установить cookie в узле js с помощью express-frameworks?
  • Хотя цикл с обещаниями
  • Удаление ключа из документа MongoDB с использованием Mongoose
  • Отобразить основной вид HTML?
  • node-websocket-server: возможно иметь несколько отдельных «трансляций» для одного процесса node.js?
  • Как очистить настройки прокси-сервера https для NPM?
  • Сырье тела Expressjs
  • как освободить localhost от Error: прослушать EADDRINUSE
  • mongoDB / mongoose: уникальный, если не null
  • Давайте будем гением компьютера.