跳到主要内容

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

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()