2012-03-31 13 views
49

मैं अपने मोंगोज़ मॉडल को एक अलग फ़ाइल में अलग करना चाहता हूं। मैं इस तरह ऐसा करने के लिए प्रयास किया है:अलग मॉड्यूल में मोंगोस मॉडल को परिभाषित करना

var models = require('./models'); 

exports.populateMaterials = function(req, res){ 
    console.log("populateMaterials"); 
    for (var i = 0; i < materials.length; i++){ 
     var mat = new models.Materials(); 
     console.log(mat); 
     mat.name = materials[i].variantName; 
     mat.materialId = materials[i].itemNumberExtension; 
     mat.surcharge = materials[i].priceOffset; 
     for (var j = 0; j < materials[i].colors.length; j++){ 
      mat.colors.colorName = materials[i].colors[j].name; 
      mat.colors.colorId = materials[i].colors[j].itemNumberExtension; 
      mat.colors.surcharge = materials[i].colors[j].priceOffset; 
     } 
     mat.save(function(err){ 
      if(err){ 
       console.log(err); 
      } else { 
       console.log('success'); 
      } 
     }); 
    } 
    res.render('index', { title: 'Express' }); 
}; 

इस एक अलग मॉड्यूल में एक मॉडल को संदर्भित करने के लिए एक उचित दृष्टिकोण है:

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

var Material = new Schema({ 
    name    : {type: String, index: true}, 
    id     : ObjectId, 
    materialId   : String, 
    surcharge   : String, 
    colors    : { 
     colorName  : String, 
     colorId   : String, 
     surcharge  : Number 
    } 
}); 

var SeatCover = new Schema({ 
    ItemName   : {type: String, index: true}, 
    ItemId    : ObjectId, 
    Pattern    : String, 
    Categories   : { 
     year   : {type: Number, index: true}, 
     make   : {type: String, index: true}, 
     model   : {type: String, index: true}, 
     body   : {type: String, index: true} 
    }, 
    Description   : String, 
    Specifications  : String, 
    Price    : String, 
    Cost    : String, 
    Pattern    : String, 
    ImageUrl   : String, 
    Materials   : [Materials] 
}); 

mongoose.connect('mongodb://127.0.0.1:27017/sc'); 

var Materials = mongoose.model('Materials', Material); 
var SeatCovers = mongoose.model('SeatCover', SeatCover); 

exports.Materials = Materials; 
exports.SeatCovers = SeatCovers; 

फिर, मैं इस तरह के मॉडल का उपयोग करने का प्रयास किया?

+1

'[सामग्री]' के बजाय '[सामग्री]' होना चाहिए, नहीं? – Tinou

+0

नहीं, सामग्री मॉडल का नाम है, जो स्कीमा संदर्भ है। सामग्री केवल स्थानीय चर का नाम है। –

उत्तर

8

मूल दृष्टिकोण उचित दिखता है।

एक विकल्प के रूप में आप मॉडल और नियंत्रक कार्यक्षमता एकीकृत के साथ 'प्रदाता' मॉड्यूल पर विचार कर सकते हैं। इस तरह आप app.js प्रदाता को तत्काल प्राप्त कर सकते हैं और फिर सभी नियंत्रक कार्यों को निष्पादित किया जा सकता है। App.js को लागू करने के लिए संबंधित नियंत्रक कार्यक्षमता के साथ केवल रूट निर्दिष्ट करना होगा।

थोड़ी देर के लिए आप इन मॉड्यूल के बीच गोंद के रूप में app.js के साथ एक अलग मॉड्यूल में मार्गों को ब्रांच करने पर विचार कर सकते हैं।

+0

धन्यवाद! मै उसे करने की एक कोशिश तो करूंगा। –

+2

मुझे –

+3

प्रबंधित करने के तरीके पर एक उदाहरण देखने के लिए उत्सुकता होगी https://github.com/cmarin/MongoDB-Node-Express-Blog ऊपर उल्लिखित अवधारणा का एक अच्छा कार्यान्वयन है। – almypal

70

मैं मॉडल फ़ाइल के बाहर डेटाबेस को परिभाषित करना चाहता हूं ताकि इसे nconf का उपयोग करके कॉन्फ़िगर किया जा सके। एक और फायदा यह है कि आप मॉडलों के बाहर मोंगो कनेक्शन का पुन: उपयोग कर सकते हैं।

module.exports = function(mongoose) { 
    var Material = new Schema({ 
     name    : {type: String, index: true}, 
     id     : ObjectId, 
     materialId   : String, 
     surcharge   : String, 
     colors    : { 
      colorName  : String, 
      colorId   : String, 
      surcharge  : Number 
     } 
    }); 
    // declare seat covers here too 
    var models = { 
     Materials : mongoose.model('Materials', Material), 
     SeatCovers : mongoose.model('SeatCovers', SeatCover) 
    }; 
    return models; 
} 

और फिर आप इसे इस तरह कहेंगे ...

var mongoose = require('mongoose'); 
mongoose.connect(config['database_url']); 
var models = require('./models')(mongoose); 
var velvet = new models.Materials({'name':'Velvet'}); 
+14

+1। मैं व्यक्तिगत रूप से इसका इस्तेमाल करता हूं और सोचा कि मैं अकेला था। अंत में देखना अच्छा लगता है कि मैं शुरुआत से कुछ कर रहा हूं। –

+0

क्या आपको अपनी मॉडल फ़ाइल में createConnection का उपयोग नहीं करना है? – alexislg

+0

नहीं, वास्तव में मुझे लगता है कि यदि आप नहीं करते हैं तो यह बेहतर होगा। मॉडल को एक मोंगोस ऑब्जेक्ट की आवश्यकता होती है और यही वह सब कुछ है जिसकी वे परवाह करते हैं। एक ही स्थान पर कनेक्शन प्रबंधन बेहतर है और मोंगोज़ ऑब्जेक्ट को "इंजेक्ट" करें। कॉन्फ़िगरेशन प्रबंधन और कोड पुन: उपयोग के लिए यह सबसे अच्छा अभ्यास है। –

संबंधित मुद्दे