5

これが私がやろうとしていることです。

私は信頼できる環境で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);
}

そして、findOne についても同じです。Mongoose を直接拡張してこれを行う方法は知っていますが、それは汚いと感じます。私はむしろ、ミドルウェアまたはこれをクリーンである程度将来性のある方法で行う他の構造を使用したいと考えています。

モデルごとに静的を介してこれを達成できることは承知していますが、すべてのモデルで普遍的に実行したいと考えています。何かアドバイス?

4

2 に答える 2

0

これを行うには、適用したい任意のスキーマに追加して機能する単純な 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) {...});
于 2015-03-23T17:14:59.610 に答える