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

Node.js 有没有办法在查询生成器中使用Mongoose中间件?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,这就是我要做的 我在一个受信任的环境中使用mongoosejs(也就是说,传递的总是被认为是安全的/预先验证的),我需要在我运行的每个查询上传递“选择”和“填充”信息。对于每一个请求,我都会以一致的方式得到它。我想这样做: var paramObject = sentFromUpAbove; // sent down on every Express request var query = {...} Model.myFind(query, paramObject).exec(function(

这就是我要做的

我在一个受信任的环境中使用mongoosejs(也就是说,传递的总是被认为是安全的/预先验证的),我需要在我运行的每个查询上传递“选择”和“填充”信息。对于每一个请求,我都会以一致的方式得到它。我想这样做:

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);
}
芬顿也一样。我知道如何通过直接扩展猫鼬来实现这一点,但这感觉很脏。我更愿意使用中间件或其他某种结构,以一种干净的、某种程度上经得起未来考验的方式来实现这一点


我知道我可以通过模型对模型的静力学来实现这一点,但我希望在每个模型上都这样做。有什么建议吗?

您可以执行类似的操作,但不幸的是,find操作不调用
pre
post
,因此它们跳过了中间件

您可以通过创建一个简单的Mongoose来实现这一点,该Mongoose将
myFind
myFindOne
函数添加到您希望将其应用到的任何模式中:

// 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) {...});

显然,向原型中添加是实现这一点的方法。不管脏不脏,我想是时候潜水了。