2012-12-06 9 views
5

Ecco cosa sto cercando di fare.C'è un modo per usare il middleware Mongoose con il generatore di query?

Sto utilizzando mongoosejs in un ambiente attendibile (ovvero ciò che viene passato è sempre considerato sicuro/prevalidato) e ho bisogno di passarlo "selezionare" e "popolare" su potenzialmente ogni query che eseguo. Sto ottenendo questo in modo coerente per ogni richiesta. Voglio fare qualcosa di simile:

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

La funzione vorrei passare al middleware o altro costrutto è semplice, basta:

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

E lo stesso per un findOne. So come farlo estendendo direttamente Mangusta, ma è sporco. Preferisco usare il middleware o qualche altro costrutto che faccia questo in modo pulito e alquanto futuro.

Sono consapevole del fatto che posso eseguire questo tramite statica su base modello per modello, ma mi piacerebbe farlo universalmente su ogni modello. Qualche consiglio?

+0

Quindi, apparentemente, aggiungendo al prototipo è il modo per farlo. Sporco o no, immagino sia ora di tuffarci. –

risposta

0

Si può fare qualcosa di simile a this, ma sfortunatamente trovare le operazioni non chiamare pre e post in modo da saltare il middleware.

0

Si può fare questo con la creazione di un semplice Mongoose plugin che aggiunge myFind e myFindOne funzioni a qualsiasi schema che si desidera applicarlo a:

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