2012-12-06 16 views
5

İşte yapmaya çalıştığım şey.Mongoose ara katmanını sorgu oluşturucu ile birlikte kullanmanın bir yolu var mı?

Güvenilir bir ortamda mongoosejs kullanıyorum (ne geçtiyse her zaman güvenli/yaygın olarak kabul edilir) ve çalışmam gereken her sorguda "seç" ve "doldur" öğelerini iletmem gerekiyor. Bunu her istek için tutarlı bir şekilde alıyorum. Ben katman veya diğer yapı için geçerdi

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

fonksiyon sadece basit::

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

Ve findOne için aynı Böyle bir şey yapmak istiyorum. Mongoose'u doğrudan genişleterek bunu nasıl yapacağımı biliyorum ama bu kirli hissettiriyor. Bu yazılımı temiz ve biraz ileride kanıtlayan bir şekilde orta katman veya başka bir yapı kullanmayı tercih ederim.

Modele göre bir model üzerinde statikler aracılığıyla bunu başarabileceğimin farkındayım, ancak bunu her modelde evrensel olarak yapmak istiyorum. Herhangi bir tavsiye?

+0

Bunu yapmanın yoludur. Kirli ya da sanmıyorum, dalış zamanı. –

cevap

0

this'a benzer bir şey yapabilirsiniz, ancak maalesef, işlemleri ara katman yazılımını atlayabilmeleri için pre ve numaralı çağrıları aramayın.

0

Sen bunu uygulamak istediğiniz şemaya myFind ve myFindOne fonksiyonları ekler basit bir Mongoose plugin oluşturarak bunu yapabilirsiniz: prototip ekleyerek Yani görünüşte

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