如何使用mongoose诺言 – mongo

有人可以给我一个关于如何使用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; }; 

在某些时候,我期待着我的数据出现,但是我怎样才能访问它,或者得到它呢?

在当前版本的Mongoose中, exec()方法返回一个Promise,所以你可以执行以下操作:

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

然后,当你想获得数据,你应该使它asynchronous:

 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

当您在查询中调用exec()时,Mongoose已经使用promise。

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

Mongoose 4.0发行说明

Mongoose 4.0带来了一些令人兴奋的新function:浏览器中的模式validation,查询中间件,更新validation以及asynchronous操作的承诺

mongoose@4.1你可以使用任何你想要的承诺

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

PS mongoose5.0

如果可用的话,Mongoose 5.0将默认使用本地承诺 ,否则不会承诺。 您仍然可以使用mongoose.Promise = require('bluebird'); 但是,mpromise将不被支持。

我相信你在找

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

在这个页面上: http : //mongoosejs.com/docs/promises.html

标题是插入你自己的承诺库

像这样使用蓝鸟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 })