node.js-如何使用猫鼬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;

};

在某个时候,我希望我的数据能够存在,但是我该如何访问或获取它呢?

user600314 asked 2020-07-26T14:58:35Z
6个解决方案
46 votes

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

Alexander Shtuchkin answered 2020-07-26T14:59:11Z
29 votes

当您在查询上调用exec()时,猫鼬已经使用了promises。

var promise = Content.find( {route : r }).exec();
konsumer answered 2020-07-26T14:59:31Z
22 votes

猫鼬4.0发行说明

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

附言 猫鼬5.0

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

Alexey B. answered 2020-07-26T15:00:21Z
5 votes

我相信你在找

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;

};
deedubs answered 2020-07-26T15:00:41Z
0 votes

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

标题是插入您自己的Promises库

Mr.Thanks answered 2020-07-26T15:01:05Z
-1 votes

使用bluebird 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
    })
Antoine answered 2020-07-26T15:01:29Z
translate from https://stackoverflow.com:/questions/9022099/how-to-use-mongoose-promise-mongo