您的位置:首页 > Web前端 > Node.js

nodejs MODEL层 封装(一)

2016-05-13 20:28 471 查看
作者:短工邦技术部 - 陈文哲

node.js+express.js+mongooes+jade一圈走下来,感觉还是不够简便,概念也比较混乱,所以我着手按我的思路重新优化了这个框架。重点是优化MODEL层,从mongoose下手。

优化后的MODEL代码,举个栗子

var Schema = require('mongoose').Schema;

var MODEL = Schema({
Advertiser: {type:Schema.Types.ObjectId,ref:'UserMODEL'},
Name: String,  //任务名称
Intro: String,
createdAt:{
type:Date,
default:Date.now()
},
updatedAt:{
type:Date,
default:Date.now()
}
}, {collection: "Plan"});

//  定义该MODEL的能提供的数据操作
//  这里就是封装重点!
//  1:为了让应用层按一定的规范来获取数据
//  2:让MODEL层保持一致,而不是乱七八糟为应用层提供各种各样的方法。
MODEL.statics = {
Find : function( query, data ) {
if(!query.limit){
//默认限制1000条结果
query.limit = 1000;
}
if(!query.order){
//默认按“创建时间”倒序排列
query.order = "-createdAt";
}
if(!query.include){
//这里传入是否要获取外建表的数据
//mongoose是调用populate方法,但这个单词不好理解,我就改成include了~
query.include = "";
}
return this.find(query.where).populate(query.include).limit(query.limit).sort(query.order).exec( data );
},
Update : function( query,data){
return this.update({_id:query._id},query.data).exec(data);
}
};
//每一次保存之前会调用这个方法,更新数据的“更新时间”
MODEL.pre("save",function(next) {
if(this.isNew){
this.createdAt = this.updatedAt = Date.now();
}
else{
this.updatedAt = Date.now();
}
next();
});

/* global db */
module.exports = db.model('UserMODEL', MODEL);


然后,应用层(Controller)就可以这样子操作了

//广告计划管理
exports.get_plan = function(req, res) {
PlanMODEL.Find({
"where":{
"Name":"计划名"
},
"include":"Advertiser"
},function(err,data){
var newData = [];
for(var i=0;i<data.length;i++){
newData.push({
"PlanName":data[i].Name,
"UserName":data[i].Advertiser.Name
});
}
res.render('Admin/plan',{"data":data});
});
};


还能不能更简单?封装得更加无死角?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  node.js