Как использовать мангуст Promise - Монго - PullRequest
42 голосов
/ 26 января 2012

Может кто-нибудь привести пример использования Promise с mongoose. Вот что у меня есть, но оно не работает, как ожидалось:

app.use(function (req, res, next) {
  res.local('myStuff', myLib.process(req.path, something));
  console.log(res.local('myStuff'));
  next();
});

и затем в myLib у меня будет что-то вроде этого:

exports.process = function ( r, callback ) {
  var promise = new mongoose.Promise;
  if(callback) promise.addBack(callback);

  Content.find( {route : r }, function (err, docs) {
     promise.resolve.bind(promise)(err, docs);

  });

  return promise;

};

В какой-то момент я ожидаю, что мои данные будут представлены, но как я могу получить к ним доступ или получить к ним доступ?

Ответы [ 6 ]

46 голосов
/ 08 января 2014

В текущей версии Mongoose метод exec() возвращает Promise, поэтому вы можете сделать следующее:

exports.process = function(r) {
    return Content.find({route: r}).exec();
}

Затем, когда вы хотите получить данные, вы должны сделать их асинхронными:

app.use(function(req, res, next) {
     res.local('myStuff', myLib.process(req.path));
     res.local('myStuff')
         .then(function(doc) {  // <- this is the Promise interface.
             console.log(doc);
             next();
         }, function(err) {
             // handle error here.
         });
});

Для получения дополнительной информации об обещаниях, я недавно прочитал замечательную статью: http://spion.github.io/posts/why-i-am-switching-to-promises.html

29 голосов
/ 09 мая 2014

Mongoose уже использует обещания, когда вы звоните exec() по запросу.

var promise = Content.find( {route : r }).exec();
22 голосов
/ 16 сентября 2015

Замечания к выпуску Mongoose 4.0

Mongoose 4.0 приносит некоторые новые интересные функции: проверка схемы в браузере запросите промежуточное ПО, проверка при обновлении, и обещания для асинхронных операций .

С mongoose@4.1 вы можете использовать любые обещания, которые хотите

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

Еще один пример с полифиллингом global.Promise

require('es6-promise').polyfill();
var mongoose = require('mongoose');

Итак, вы можете просто сделать позже

Content
  .find({route : r})
  .then(function(docs) {}, function(err) {});

Или

Content
  .find({route : r})
  .then(function(docs) {})
  .catch(function(err) {});

P.S. Мангуст 5,0

Mongoose 5.0 будет использовать собственные обещания по умолчанию , если доступно, в противном случае никаких обещаний. Вы все равно сможете устанавливать собственные обещания библиотека с использованием mongoose.Promise = require('bluebird');, однако, mpromise не будет поддерживаться.

5 голосов
/ 31 января 2012

Я полагаю, вы ищете

exports.process = function ( r, callback ) {
  var promise = new mongoose.Promise;
  if(callback) promise.addBack(callback);

  Content.find( {route : r }, function (err, docs) {
     if(err) {
       promise.error(err);
       return;
     }
     promise.complete(docs);

  });

  return promise;

};
0 голосов
/ 12 января 2017

На этой странице: http://mongoosejs.com/docs/promises.html

Название Подключение вашей собственной библиотеки обещаний

0 голосов
/ 11 августа 2015

Используйте библиотеку Bluebird Promise следующим образом:

var Promise = require('bluebird');
var mongoose = require('mongoose');
var mongoose = Promise.promisifyAll(mongoose);

User.findAsync({}).then(function(users){
  console.log(users)
})

Это возможно, например:

User.findAsync({}).then(function(users){
      console.log(users)
    }).then(function(){
      // more async stuff
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...