如何使用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 })