我试图将一个链方法添加到名为“paginate”的Query对象中。如果我将它添加到query.js我可以毫无问题地使用它。但是,修改其中一个核心文件并不是一个好主意。
我正在使用我发现的这些代码进行了一些修改,并希望它成为Query原型的一部分,但我没有取得任何成功,使它在Query.js之外运行。
我怎样才能做到这一点?有没有关于如何通过模块扩展这些核心文件的文档?我找不到任何适合我的东西。
mongoose.Query.prototype.paginate = function(page, limit, cb) {
var model, query, skipFrom;
if (page == null) {
page = 1;
}
if (limit == null) {
limit = 10;
}
query = this;
model = this.model;
skipFrom = (page * limit) - limit;
query = query.skip(skipFrom).limit(limit);
if (cb) {
return query.run(function(err, docs) {
if (err) {
return cb(err, null, null);
} else {
return model.count(query._conditions, function(err, total) {
return cb(null, total, docs);
});
}
});
} else {
throw new Error("pagination needs a callback as the third argument.");
}
};
答案 0 :(得分:2)
事实证明它比我预期的容易得多。这就是我所做的并且有效:
使用以下命令创建了一个paginate.js文件:
mongoose = require('mongoose');
mongoose.Query.prototype.paginate = function(aPageStart, aLimit, aCallback) {
var model, query;
if (aLimit == null) {
aLimit = 10;
}
query = this;
model = this.model;
query = query.skip(aPageStart).limit(aLimit);
if (aCallback) {
return query.run(function(aError, aDocs) {
if (aError) {
return aCallback(aError, null, null);
} else {
return model.count(query._conditions, function(aError, aTotal) {
return aCallback(null, aTotal, aDocs);
});
}
});
} else {
throw new Error("pagination needs a callback as the third argument.");
}
};
并且只需要它(在我的模型中)。
然后你可以将这个方法称为链的最后一个。
干杯,
马科斯。
答案 1 :(得分:0)
也许您可以使用此模块或查看它们是如何实现的:mongoose-paginate
另一个解决方案是为您的架构创建一个方法:
Schema.statics.paginate = (page, limit, cb) ->
...
return query;
// or
Schema.statics.paginate = (query, page, limit, cb) ->
...
return query.exec();