利用mongoose的plugin减少额外的代码

luoyjx · 2015-05-27 22:42 · 3331次阅读

API的页面 Mongoose Plugins

首先来看个例子:

通常的处理办法

// format date
topic.friendly_create_at = tools.formatDate(topic.create_at, true);
topic.friendly_update_at = tools.formatDate(topic.update_at, true);

还有

user.friendly_create_at = tools.formatDate(user.create_at, true);

反正各种各样的,那么就需要写N多次的不同的实现。

那么mongoose中的plugin怎么帮助我们完成这些事呢?

首先,定义两个用于格式化时间的方法,并导出。

/**
 * 给所有的 Model 扩展功能
 * http://mongoosejs.com/docs/plugins.html
 */
var tools = require('../common/tools');

module.exports = function(schema) {
  schema.methods.create_at_ago = function() {
    return tools.formatDate(this.create_at, true);
  }
  
  schema.methods.updated_at_ago = function() {
    return tools.formatDate(this.create_at, true);
  };
}

然后将这个plugin引入到某个schema中。

var mongoose = require('mongoose');
var BaseModel = require("./base_model");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
 
 var MessageSchema = new Schema({
   has_read: { type: Boolean, default: false },
   create_at: { type: Date, default: Date.now }
 });

 MessageSchema.plugin(BaseModel);
 MessageSchema.index({master_id: 1, has_read: -1, create_at: -1});
 
 mongoose.model('Message', MessageSchema);

再将使用的地方改成如下方式,就可以在业务代码中省去转换的过程。

<a class="reply_time" href="#<%= reply._id %>"><%= indexInCollection + 1 %>楼•<%= reply.friendly_create_at
<a class="reply_time" href="#<%= reply._id %>"><%= indexInCollection + 1 %>楼•<%= reply.create_at_ago()
收藏

暂无评论

登录后可以进行评论。没有账号?马上注册