2013-02-19 38 views
5

में मॉडल पैरामीटर पास करना मेरे पास एक मोंगोज़ मॉडल है जिसमें उपयोगकर्ता मॉडल के साथ एक सहयोग है।एक मॉड्यूलोज मॉडल

var exampleSchema = mongoose.Schema({ 
    name: String, 
    <some more fields> 
    userId: { type:mongoose.Schema.Types.ObjectId, ref: 'User' } 
}); 

var Example = mongoose.model('Example', userSchema) 

जब मैं एक नया मॉडल का दृष्टांत मुझे क्या करना:

// the user json object is populated by some middleware 
var model = new Example({ name: 'example', .... , userId: req.user._id }); 

मॉडल के निर्माता जो लिख सकते हैं और refactor करने के लिए जब स्कीमा परिवर्तन कठिन बन गया है मानकों का एक बहुत लेता है। वहाँ की तरह कुछ करने का तरीका है:

var model = new Example(req.body, { userId: req.user._id }); 

या एक JSON ऑब्जेक्ट उत्पन्न या यहाँ तक कि अनुरोध शरीर के लिए userId संलग्न करने के लिए एक सहायक विधि बनाने के लिए सबसे अच्छा तरीका है? या ऐसा कोई तरीका है जिसके बारे में मैंने सोचा भी नहीं है?

उत्तर

7
_ = require("underscore") 

var model = new Example(_.extend({ userId: req.user._id }, req.body)) 

या आप req.body में userId नकल करना चाहते हैं:

// We "copy" the request body to not modify the original one 
var example = Object.create(req.body); 

// Now we add to this the user id 
example.userId = req.user._id; 

// And finally... 
var model = new Example(example); 

इसके अलावा,:

var model = new Example(_.extend(req.body, { userId: req.user._id })) 
2

अगर मैं तुम्हें सही ढंग से समझ में आया, आप अच्छी कोशिश कर निम्नलिखित हो जाएगा अपने स्कीमा विकल्पों में जोड़ने के लिए मत भूलना{ strict: true }, अन्यथा आप अवांछित/हमलावर डेटा सहेज सकते हैं।

+4

सख्त डिफ़ॉल्ट रूप से सक्षम है क्योंकि mongoose 3. –

+0

पता है, टिप के लिए धन्यवाद! – gustavohenke

+0

'ऑब्जेक्ट.क्रेट' यहां सही फिट जैसा प्रतीत नहीं होता है क्योंकि यह 'req.body' की प्रतिलिपि नहीं करता है, यह प्रोटोटाइप ऑब्जेक्ट के रूप में इसका उपयोग करता है। निश्चित रूप से मोंगोस प्रोटोटाइप के गुणों को अनदेखा कर देगा। – JohnnyHK