2012-02-10 5 views
51

मेरे पास वर्तमान में मेरे मोंगोस/नोडजेएस अनुप्रयोग के लिए /models/models.js फ़ाइल में मेरे सभी मॉडल (स्कीमा परिभाषाएं) हैं।मोंगोस और नोडजेएस परियोजना का फ़ाइल संरचना

मैं जैसे विभिन्न फाइलों में अलग इन तोड़ने के लिए करना चाहते हैं: user_account.js, profile.js, आदि हालांकि मैं ऐसा करने के लिए के रूप में मेरे नियंत्रकों तोड़ने के लिए और "मॉड्यूल नहीं मिल सकता है" वापस रिपोर्ट एक बार नहीं कर पा रहे मैं इन वर्गों को अलग करता हूं।

/MyProject 
    /controllers 
    user.js 
    foo.js 
    bar.js 
    // ... etc, etc 
    /models 
    models.js 
    server.js 

मेरी models.js फ़ाइल की सामग्री को इस तरह दिखता है:

मेरे परियोजना संरचना इस प्रकार है

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 

mongoose.connect('mongodb://localhost/mydb'); 

var UserAccount = new Schema({ 
    user_name  : { type: String, required: true, lowercase: true, trim: true, index: { unique: true } }, 
    password  : { type: String, required: true }, 
    date_created : { type: Date, required: true, default: Date.now } 
}); 

var Product = new Schema({ 
    upc    : { type: String, required: true, index: { unique: true } }, 
    description  : { type: String, trim: true }, 
    size_weight  : { type: String, trim: true } 
}); 

मेरे user.js फ़ाइल (नियंत्रक) इस तरह दिखता है:

var mongoose = require('mongoose'), 
    UserAccount = mongoose.model('user_account', UserAccount); 

exports.create = function(req, res, next) { 

    var username = req.body.username; 
    var password = req.body.password; 

    // Do epic sh...what?! :) 
} 

मैं स्कीमा परिभाषा को कई फ़ाइलों में कैसे तोड़ सकता हूं और इसे मेरे समोच्च से भी संदर्भित कर सकता हूं ller? जब मैं इसे संदर्भ है (के बाद स्कीमा एक नई फ़ाइल में है) मैं इस त्रुटि मिलती है:

* त्रुटि: स्कीमा मॉडल के लिए "USER_ACCOUNT" पंजीकृत नहीं किया गया है *

विचार।?

+1

मैं नेवला-गोंद मॉड्यूल है जो आपके नेवला मॉडल की संरचना में मदद करता है लिखा है:: https: // आवश्यक FS की आवश्यकता होती है इस प्रकार है

var fs = require('fs'); /* * initializes all models and sources them as .model-name */ fs.readdirSync(__dirname).forEach(function(file) { if (file !== 'index.js') { var moduleName = file.split('.')[0]; exports[moduleName] = require('./' + moduleName); } }); 

अब आप अपने सभी मॉडलों के कॉल कर सकते हैं जोड़ना सुनिश्चित करें github.com/xpepermint/mongoose-glue – xpepermint

उत्तर

88

यहां नमूने app/models/item.js

var mongoose = require("mongoose"); 

var ItemSchema = new mongoose.Schema({ 
    name: { 
    type: String, 
    index: true 
    }, 
    equipped: Boolean, 
    owner_id: { 
    type: mongoose.Schema.Types.ObjectId, 
    index: true 
    }, 
    room_id: { 
    type: mongoose.Schema.Types.ObjectId, 
    index: true 
    } 
}); 

var Item = mongoose.model('Item', ItemSchema); 

module.exports = { 
    Item: Item 
} 

app/controllers/items.js में एक आइटम नियंत्रक से लोड करने के लिए मुझे क्या करना होगा

var Item = require("../models/item").Item; 
    //Now you can do Item.find, Item.update, etc 

दूसरे शब्दों में है, दोनों स्कीमा और अपने मॉडल मॉड्यूल में मॉडल और परिभाषित फिर बस मॉडल निर्यात करें। रिश्तेदार पथों का उपयोग करके अपने मॉडल मॉड्यूल को अपने नियंत्रक मॉड्यूल में लोड करें।

कनेक्शन बनाने के लिए, अपने सर्वर स्टार्टअप कोड (server.js या जो कुछ भी) में जल्दी ही संभाल लें। आम तौर पर आप कॉन्फ़िगरेशन फ़ाइल या पर्यावरण चर से कनेक्शन पैरामीटर को पढ़ना चाहेंगे और डिफ़ॉल्ट कॉन्फ़िगरेशन लोकलहोस्ट से डिफ़ॉल्ट कॉन्फ़िगरेशन प्रदान नहीं करेंगे।

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost'); 
+0

कनेक्शन कोड के बारे में क्या? एक अलग कोड में इसे कैसे शामिल करें –

+4

मैंने उस बिंदु के पते पर अपना उत्तर अपडेट किया। –

+2

यह इतना आसान था? lol – ShrekOverflow

8

पीटर लियोन काफी आधार को कवर करते हैं।

app/models/item.js

note: notice where `module.exports` is placed 
var mongoose = require("mongoose"); 

var ItemSchema = module.exports = new mongoose.Schema({ 
    name: { 
    type: String, 
    index: true 
    }, 
    ... 

}); 

app/controllers/items.js

var mongoose = require('mongoose'); 
var Item = mongoose.model('Item', require('../models/item')); 

बिना एक और तरीका से इसे लोड करने के लिए: ऊपर के उदाहरण (स्कीमा के बाद लाइनों को हटाने) से
उधार मैं सिर्फ जोड़ना चाहते थे module.exports या require:

app/models/item.js

var mongoose = require("mongoose"); 

var ItemSchema = new mongoose.Schema({ 
    name: { 
    type: String, 
    index: true 
    }, 
    ... 

}); 

mongoose.model('Item', ItemSchema); // register model 

app/controllers/items.js

var mongoose = require('mongoose') 
    , Item = mongoose.model('Item'); // registered model 
+0

और नियंत्रकों को कहां से बुलाया जाएगा? – Warz

+0

यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। क्या आप स्पष्ट कर सकते हो? – user1460015

35

एक जोड़े को यहाँ उत्तर में वास्तव में मुझे एक वैकल्पिक दृष्टिकोण के विकास में मदद। मूल प्रश्न ब्रेकिंग के बारे में तोड़ने के संबंध में है, लेकिन मैं उसी फ़ाइल में स्कीमा और मॉडल परिभाषाओं को बंडल करना पसंद करता हूं।

यह ज्यादातर केवल अपने नियंत्रक से मॉडल थोड़ा कम वर्बोज़ तक पहुँचने बनाने के लिए module.exports अधिभावी द्वारा मॉडल परिभाषा निर्यात पीटर विचार है,:

परियोजना लेआउट:

MyProject 
    /controllers 
    user.js 
    foo.js 
    bar.js 
    // ... etc, etc 
    /models 
    Item.js 
    server.js 

मॉडल/आइटम .js दिखाई देगा:

var mongoose = require("mongoose"); 

var ItemSchema = new mongoose.Schema({ 
    name: { 
    type: String, 
    index: true 
    } 
}); 

module.exports = mongoose.model('Item', ItemSchema); 
// Now `require('Item.js')` will return a mongoose Model, 
// without needing to do require('Item.js').Item 

और तुम एक नियंत्रक में मॉडल का उपयोग, user.js, की तरह कहते हैं:

var Item = require(__dirname+'/../models/Item') 

... 

var item = new Item({name:'Foobar'}); 

सर्वर.जेएस में mongoose.connect (..) को कॉल करना न भूलें, या जहां कहीं भी आप उचित मानते हैं!

9

मैंने हाल ही में इसी समस्या के संबंध में एक क्वारा प्रश्न का उत्तर दिया। http://qr.ae/RoCld1

क्या मैं बहुत अच्छा मिल गया और की मात्रा पर बचाता है की आवश्यकता होती है कॉल एक ही निर्देशिका में अपने मॉडल की संरचना करने के लिए है। सुनिश्चित करें कि आपके पास प्रति फ़ाइल केवल एक मॉडल है।

अपने मॉडल के समान निर्देशिका में index.js फ़ाइल बनाएं। इस कोड को इसमें जोड़ें।

var models = require('./path/to/models'); 
var User = models.user; 
var OtherModel = models['other-model']; 
+1

यह अब तक का सबसे अच्छा जवाब है, स्वचालन कोड में बहुत अधिक अनावश्यकता बचाता है, और यह बहुत साफ दिखता है। – zoubida13

+0

मुझे लगता है कि आपके पास प्रोजेक्ट रूट में आपका डीबी प्रारंभिक कोड है। कोई विचार यह कैसे करता है? धन्यवाद –