2012-01-26 7 views
40

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

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; 

}; 

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

+0

Соответствующих чтения - http://mongoosejs.com/docs/queries.html –

ответ

5

Я считаю, что вы ищете

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; 

}; 
44

В текущей версии Мангуста, метод exec() возвращает Promise, так что вы можете сделать следующее:

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

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

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

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

+11

Новейшая версия mongoose также позволяет использовать результат 'find()' как обещание, без необходимости вызова 'exec'. Таким образом, вы можете просто: «Content.find ({route: r)), затем (function (content) {});' – Jamie

+0

, почему вы используете res.local? вы можете напрямую использовать 'var a = myLib.process (req.path)' – OMGPOP

+0

@OMGPOP Я думаю, что OP хотел использовать обещание в шаблонах. Да, вы можете использовать его напрямую. –

28

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

var promise = Content.find({route : r }).exec(); 
+3

сохранил мой день, работает для каждого запроса – Blacksonic

+0

Начиная с Mongoose 4.13, 'find()' уже возвращает обещание. Не нужно вызывать 'exec()'. –

-1

Используйте Bluebird библиотеку Promise, как это:

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

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

Это thenable, такие как:

User.findAsync({}).then(function(users){ 
     console.log(users) 
    }).then(function(){ 
     // more async stuff 
    }) 
+0

Этот ответ устарел. У Mongoose уже есть поддержка поддержки сущностных обещаний, поэтому нет необходимости в Promisify методах. –

+0

Это было бы для версий до 4.0 – Antoine

21

Mongoose 4.0 Release Notes

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

С [email protected] вы можете использовать любые обещания, которые вы хотите

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

Другой пример с polyfilling 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. Mongoose 5.0

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

+0

. Можете ли вы привести пример использования местных обещаний с помощью mongoose 5.0? – Martin

+0

Mongoose 5.0 еще не выпущен –