如何使用mongoose Promise - mongo

use*_*314 44 mongoose mongodb node.js promise express

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

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

然后在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;

};
Run Code Online (Sandbox Code Playgroud)

在某些时候,我希望我的数据存在,但我如何访问它,或者获取它?

Ale*_*kin 46

在当前版本的Mongoose中,该exec()方法返回Promise,因此您可以执行以下操作:

exports.process = function(r) {
    return Content.find({route: r}).exec();
}
Run Code Online (Sandbox Code Playgroud)

然后,当您想要获取数据时,您应该将其设为异步:

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.
         });
});
Run Code Online (Sandbox Code Playgroud)

有关承诺的更多信息,我最近阅读了一篇精彩的文章:http: //spion.github.io/posts/why-i-am-switching-to-promises.html

  • 最新版本的mongoose还允许你使用`find()`的结果作为一个promise,而不需要调用`exec`.所以你可以这样做:`Content.find({route:r}).then(function(content){});` (12认同)

kon*_*mer 29

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

var promise = Content.find( {route : r }).exec();
Run Code Online (Sandbox Code Playgroud)

  • 保存了我的一天,适合每一个查询 (3认同)
  • 从猫鼬4.13开始,`find()`已经返回了一个promise。无需调用exec()。 (2认同)

Ale*_* B. 22

Mongoose 4.0发行说明

Mongoose 4.0带来了一些令人兴奋的新功能:浏览器中的模式验证,查询中间件,更新验证以及异步操作的承诺.

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

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
Run Code Online (Sandbox Code Playgroud)

另一个polyfilling global.Promise的例子

require('es6-promise').polyfill();
var mongoose = require('mongoose');
Run Code Online (Sandbox Code Playgroud)

所以,你可以稍后再做

Content
  .find({route : r})
  .then(function(docs) {}, function(err) {});
Run Code Online (Sandbox Code Playgroud)

要么

Content
  .find({route : r})
  .then(function(docs) {})
  .catch(function(err) {});
Run Code Online (Sandbox Code Playgroud)

PS 猫鼬5.0

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


dee*_*ubs 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;

};
Run Code Online (Sandbox Code Playgroud)