2014-08-28 64 views
6

我的朋友們,不幸的是,我找不到任何有關如何在節點js express mongoose應用程序中實現藍鳥許諾庫的例子。bluebird promisies使用nodejs,express和mongoose的crud示例

我的應用程序安裝在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); 
     } 
    }); 
}; 

//貓鼬型號

/** 
* 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); 

所以,請,如果我想使用藍鳥承諾庫,我將如何去事先改變export.list

感謝。

一些問題,

我在哪裏可以打電話promisify上的貓鼬模型? 例如Article = mongoose.model('Article'); like this Article = Promise.promisifyAll(require('Article')); 或 這樣

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

回答

10

好周圍的互聯網數週精練後,我能找到一個例子here 爲了在你的NodeJS應用與貓鼬模型工作,

您需要promisify圖書館和像這樣 模型模塊,模型實例之後,您已經定義模式現在

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

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

你可以使用你米ongoose模型作爲你的控制器的承諾,像這樣

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

即使這個問題已經很難回答了。我認爲更好的方式來promisify貓鼬是做到以下幾點:

Promise.promisifyAll(mongoose.Model); 
Promise.promisifyAll(mongoose.Model.prototype); 
Promise.promisifyAll(mongoose.Query.prototype); 

這樣,所有的模塊將自動擁有異步功能。

另請參閱:mongoose-bird一個圖書館正在做這件事。

2

您實際上可以在模型的頂部做一個更簡單的單線程。

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

創建你的模型像正常,瞧。一切都爲你而設。

+0

你知道如何用es6做到這一點嗎? 我怎麼會promination這個'從mongoose'進口貓鼬';' – 2016-06-01 05:19:01

+0

我相信它會是這樣的:'從'mongoose'進口{mongoose}; 從'bluebird'導入{bluebird}; var mongoose = bluebird.promisifyAll(mongoose);'但我不確定。你可以混合commonJS與es6兩種方式,所以我不會擔心它@JesusAdolfoRodriguez – 2016-06-01 14:59:25