【问题标题】:How to use mongoose Promise - mongo如何使用猫鼬 Promise - mongo
【发布时间】:2012-02-19 18:45:13
【问题描述】:

谁能给我一个关于如何在猫鼬中使用 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;

};

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

【问题讨论】:

标签: node.js mongodb express mongoose promise


【解决方案1】:

在当前版本的 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.
         });
});

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

【讨论】:

  • 最新版本的 mongoose 还允许您使用find() 的结果作为承诺,而无需调用exec。所以你可以这样做:Content.find({route: r}).then(function(content) { } );
  • 为什么要使用 res.local?可以直接用var a = myLib.process(req.path)
  • @OMGPOP 我认为 OP 想在模板中使用 Promise。是的,可以直接使用。
【解决方案2】:

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

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

【讨论】:

  • 从 Mongoose 4.13 开始,find() 已经返回了一个承诺。无需致电exec()
【解决方案3】:

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

附: Mongoose 5.0

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

【讨论】:

  • 你能举一个在猫鼬 5.0 中使用原生 Promise 的例子吗?
  • Mongoose 5.0 尚未发布
  • 我已经导入了 import { Mongoose } from "mongoose"; 在这种情况下如何使用 bluebird 和 promise?
【解决方案4】:

我相信你正在寻找

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;

};

【讨论】:

    【解决方案5】:

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

    标题是Pluging in your own Promises Library

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 这个答案已经过时了。 Mongoose 已经有了原生的 Promise 支持,所以不需要 Promisify 方法。
      • 这适用于 4.0 之前的版本
      猜你喜欢
      • 2019-02-09
      • 2016-09-18
      • 2011-10-25
      • 2021-01-02
      • 2014-07-29
      • 1970-01-01
      • 2021-01-28
      • 2017-10-11
      • 2013-07-27
      相关资源
      最近更新 更多