bluebird使用节点js,express和mongoose承诺crud示例

时间:2014-08-28 17:57:28

标签: javascript node.js express mongoose bluebird

我的朋友们,不幸的是我找不到任何关于如何在节点js express mongoose app中实现bluebird promise库的例子。

我的应用程序设置为猫鼬模型,控制器和路径在不同的文件中。

但是用mongoose实现它,我只是想不通。

所以请有人告诉我它是如何使用的。请看下面。

//express controller Article.js


var mongoose = require('mongoose'),
errorHandler = require('./errors'),
Article = mongoose.model('Article');

exports.list = function(req, res) {
Article.find().sort('-created').populate('user', 'displayName').exec(function(err, articles) {
      if (err) {
          return res.status(400).send({
            message: errorHandler.getErrorMessage(err)
          });
      } else {
          res.jsonp(articles);
      }
  });
};

// Mongoose模型

 /**
 * Module dependencies.
 */
 var mongoose = require('mongoose'),
 Schema = mongoose.Schema;

 /**
 * Article Schema
 */
 var ArticleSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    title: {
        type: String,
        default: '',
        trim: true,
        required: 'Title cannot be blank'
    },
    content: {
        type: String,
        default: '',
        trim: true
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

mongoose.model('Article', ArticleSchema);

所以,如果我想使用Bluebird promise库,我将如何改变export.list

提前致谢。

一些问题,

我在猫鼬模型上调用promisify的地方? 例如Article = mongoose.model('Article'); like this Article = Promise.promisifyAll(require(' Article')); 要么 像这样

  var Article = mongoose.model('Article');
  Article = Promise.promisifyAll(Article);

2 个答案:

答案 0 :(得分:10)

在互联网上搜索数周后,我找到了一个例子here 为了在nodejs app中使用mongoose模型,

你需要像这样宣传图书馆和模型实例 在您的模型模块中,在定义了模式之后

var Article = mongoose.model('Article', ArticleSchema);
Promise.promisifyAll(Article);
Promise.promisifyAll(Article.prototype);

exports.Article = Article;
//Replace Article with the name of your Model.

现在你可以使用你的mongoose模型作为控制器中的一个承诺,就像这样

exports.create = function(req, res) {
    var article = new Article(req.body);
    article.user = req.user;

    article.saveAsync().then(function(){
        res.jsonp(article);
    }).catch(function (e){
        return res.status(400).send({
            message: errorHandler.getErrorMessage(e)
        });
    });
  };

答案 1 :(得分:2)

你实际上可以在模型的顶部做一个更简单的单线程。

var mongoose = require('bluebird').promisifyAll(require('mongoose'));

像平常一样创建你的模型,瞧。一切都为你承诺。