如何使用mongoose Promise - mongo

时间:2012-01-26 17:04:04

标签: node.js mongodb express mongoose promise

有人可以给我一个关于如何使用与猫鼬一起使用Promise的例子。这就是我所拥有的,但它没有按预期工作:

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 个答案:

答案 0 :(得分:46)

在当前版本的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

答案 1 :(得分:28)

当你在查询上调用exec()时,Mongoose已经使用了promises。

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

答案 2 :(得分:22)

Mongoose 4.0 Release Notes

  

Mongoose 4.0带来了一些令人兴奋的新功能:架构验证   在浏览器中,查询中间件,验证更新,和承诺   用于异步操作

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

P.S。 Mongoose 5.0

  

Mongoose 5.0将默认使用本机承诺(如果可用),   否则没有承诺。您仍然可以设置自定义承诺   但是,使用mongoose.Promise = require('bluebird');的库   不支持mpromise。

答案 3 :(得分: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;

};

答案 4 :(得分:0)

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

  

标题是插入自己的Promises库

答案 5 :(得分:-1)

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