有没有办法使用查询生成器使用Mongoose中间件?

这是我想要做的。

我在一个值得信赖的环境中使用mongoosejs(也就是传递的东西总是被认为是安全的/预先validation的),我需要通过它来select和填充潜在的每个查询。 我以一致的方式得到这个每一个请求。 我想要做这样的事情:

var paramObject = sentFromUpAbove; // sent down on every Express request var query = {...} Model.myFind(query, paramObject).exec(function(err, data) {...}); 

我将传递给中间件或其他构造的函数很简单,只是:

 function(query, paramObject) { return this.find(query) .populate(paramObject.populate) .select(paramObject.select); } 

和findOne一样。 我知道如何通过直接延伸mongoose来做到这一点,但感觉很脏。 我宁愿使用中间件或其他构造,以干净,有些未来的方式来做这件事。

我知道我可以通过静态模型来完成这个模型,但是我想在每个模型上都做到这一点。 有什么build议?

你可以做类似这样的事情,但不幸的是,查找操作不会调用prepost所以他们跳过中间件。

你可以通过创build一个简单的Mongoose 插件来实现这一点,该插件可以将myFindmyFindOne函数添加到您希望应用到的任何模式中:

 // Create the plugin function as a local var, but you'd typically put this in // its own file and require it so it can be easily shared. var selectPopulatePlugin = function(schema, options) { // Generically add the desired static functions to the schema. schema.statics.myFind = function(query, paramObject) { return this.find(query) .populate(paramObject.populate) .select(paramObject.select); }; schema.statics.myFindOne = function(query, paramObject) { return this.findOne(query) .populate(paramObject.populate) .select(paramObject.select); }; }; // Define the schema as you normally would and then apply the plugin to it. var mySchema = new Schema({...}); mySchema.plugin(selectPopulatePlugin); // Create the model as normal. var MyModel = mongoose.model('MyModel', mySchema); // myFind and myFindOne are now available on the model via the plugin. var paramObject = sentFromUpAbove; // sent down on every Express request var query = {...} MyModel.myFind(query, paramObject).exec(function(err, data) {...});