文章目录

使用node.js+mysql开发项目中用到了很出名的 node orm2 ,我们实现分页可以使用标准的 limit和offset来实现,列入 “PersionModel.all().limit(20).offset(0)”,但是每次都去写这么长,而且limit和offset的参数是动态的,还需要去计算很麻烦,我们可以把这个封装一下。
那么问题来了,怎么封装呢?难道每个model都去定义一个method的?当然不可能这么去做,orm本身支持plugin模式,如下:

Paging.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module.exports = Plugin;
function Plugin(db) {
return {
define: function (Model) {
Model.settings.set("pagination.perpage", 20);
Model.page = function (n,size) {
if(!isNaN(size))Model.settings.set("pagination.perpage", size);
var perpage = Model.settings.get("pagination.perpage");
var m = this.limit?this:this.all();// 这里处理是避免直接使用Model调用会报错。
return m.offset( (n - 1) * perpage ).limit(perpage);
};
Model.pages = function (cb) {
Model.count(function (err, count) {
if (err) {
return cb(err);
}
return cb(null, Math.ceil(count / Model.settings.get("pagination.perpage")));
});
};
}
};
}

把插件添加到orm上
1
2
3
4
5
6
7
var paging = require("./paging");
orm.connect("mysql://username:password@host/database", function (err, db) {
if (err) throw err;
db.use(paging);// 使用use注册插件
});

这样分页就搞定了,另外还可以在page中再次封装一下返回一个通用的Page对象,我这里就先不做演示了,无非就是pageIndex,pageSize,totalPage,hanNext之类的属性和方法。

此文是本站原创,转载请标注作者和链接出处!