2013-02-01 21 views
6

मैं एक समस्या है मेरी नेवला मॉडलनेवला मॉडल परीक्षण मॉडल

परीक्षण मैं की तरह

  • अनुप्रयोग एक संरचना
    • मॉडल
      • पता
      • उपयोगकर्ता
      • संगठन की आवश्यकता होती है
    • परीक्षण

दोनों मॉडल उपयोगकर्ता और संगठन मॉडल पता जानना चाहते हैं। मेरे मॉडल इस प्रकार संरचित हैं:

module.exports = function (mongoose, config) { 

    var organizationSchema = new mongoose.Schema({ 

     name : { 
      type : String 
     }, 
     addresses : { 
      type : [mongoose.model('Address')] 
     } 

    }); 

    var Organization = mongoose.model('Organization', organizationSchema); 

    return Organization; 
}; 

मेरे सामान्य ऐप में मुझे उपयोगकर्ता और संगठन की आवश्यकता से पहले पता चाहिए और सब कुछ ठीक है। मैंने अब उपयोगकर्ता और संगठन के लिए परीक्षण लिखे हैं। पता मॉडल पंजीकृत करने के लिए मैं require('../models/Address.js') पर कॉल करता हूं यदि यह एक परीक्षण चलाता है तो यह ठीक काम करता है। लेकिन अगर मैं बैच में सभी परीक्षण चलाता हूं तो मुझे एक त्रुटि मिलती है क्योंकि मैंने दो बार पता दर्ज करने का प्रयास किया था।

OverwriteModelError: Cannot overwrite Address model once compiled.

मैं इस समस्या को कैसे हल करते हैं?

+0

मैं एक ऐसी ही सवाल का जवाब यहां। http://stackoverflow.com/a/16248673/383217 –

उत्तर

12

समस्या यह है कि आप दो बार मोंगोज मॉडल सेट नहीं कर सकते हैं। आपकी समस्या को हल करने का सबसे आसान तरीका node.js require फ़ंक्शन का लाभ उठाना है।

नोड.जेएस आपके मॉडल को दो बार शुरू करने से रोकने के लिए require पर सभी कॉल कैश करता है। लेकिन आप अपने मॉडल को कार्यों के साथ लपेटते हैं। उन्हें अनवरोधित करने से आपकी समस्या हल हो जाएगी:

var mongoose = require('mongoose'); 
var config = require('./config'); 

var organizationSchema = new mongoose.Schema({ 
    name : { 
     type : String 
    }, 
    addresses : { 
     type : [mongoose.model('Address')] 
    } 
}); 

module.exports = mongoose.model('Organization', organizationSchema); 

वैकल्पिक समाधान यह सुनिश्चित करना है कि प्रत्येक मॉडल केवल एक बार आरंभ हो। उदाहरण के लिए, यदि आप अपने परीक्षण चलाने से पहले आप सभी मॉड्यूल को प्रारंभ कर सकते हैं:

Address = require('../models/Address.js'); 
User = require('../models/User.js'); 
Organization = require('../models/Organization.js'); 

// run your tests using Address, User and Organization 

या आप इस विशेष मामले को संभालने के लिए अपने मॉडल को try catch बयान जोड़ सकते हैं:

module.exports = function (mongoose, config) { 

    var organizationSchema = new mongoose.Schema({ 

     name : { 
      type : String 
     }, 
     addresses : { 
      type : [mongoose.model('Address')] 
     } 

    }); 

    try { 
     mongoose.model('Organization', organizationSchema); 
    } catch (error) {} 

    return mongoose.model('Organization'); 
}; 

अद्यतन: हमारी परियोजना में हमारे पास सब कुछ संभालने के लिए /models/index.js फ़ाइल है। सबसे पहले, यह कनेक्शन स्थापित करने के लिए mongoose.connect पर कॉल करता है। फिर इसे models निर्देशिका में प्रत्येक मॉडल की आवश्यकता होती है और इसके एक शब्दकोश को बनाता है। इसलिए, जब हमें कुछ मॉडल की आवश्यकता होती है (उदा। user) हमें require('/models').user पर कॉल करके इसकी आवश्यकता होती है।

+0

मैं पहले समाधान के साथ जाना चाहता हूं लेकिन मुझे मोंगोस के संदर्भों के कारण चिंतित है, मुझे उम्मीद है कि यह मोंगोस के संदर्भ को तोड़ने वाला नहीं है क्योंकि मैं करता हूं mongoose.connect मेरी app.js फ़ाइल में, लेकिन जैसा कि आप कहते हैं कि नोड आवश्यकता को इकट्ठा करेगा और एक प्रतिलिपि देगा यदि यह पहले से ही आवश्यक है? – pfried

+0

मेरे कोड को दोबारा प्रतिक्रिया दी, फ़ंक्शन रैपर को हटा दिया और ठीक काम करता है, धन्यवाद! – pfried

+0

हां, लेकिन इस मामले में आपको अपने किसी भी मॉडल को शुरू करने से पहले 'mongoose.connect' को कॉल करना चाहिए। –

-1

मैंने इसे r.js को पैच करके और यह सुनिश्चित करने के लिए तय किया कि मेरे सभी मॉड्यूल स्थानीय रिक्वेयर कॉल का उपयोग करते हैं।

चेकआउट यहाँ

https://github.com/jrburke/requirejs/issues/726

1

पहले से ही यह सवाल धागा एक जवाब है, लेकिन पूरा करने के लिए एक अनोखा तरीका के लिए इस https://github.com/fbeshears/register_models की जाँच करें। यह नमूना प्रोजेक्ट एक register_models.js का उपयोग करता है जिसमें फ़ाइल नामों की सरणी से सभी मॉडल शामिल होते हैं। यह वास्तव में अच्छी तरह से काम करता है और जहां भी आपको उनकी ज़रूरत होती है, आप अपने सभी मॉडलों के साथ बहुत अधिक अंत तक समाप्त होते हैं। ध्यान रखें कि node.js का कैश आपके प्रोजेक्ट में ऑब्जेक्ट कैश करेगा जबकि यह चल रहा है।

0

मैं इस समस्या से निपटने के लिए प्रयास/पकड़ का उपयोग करता हूं और यह ठीक काम करता है। लेकिन मुझे लगता है कि यह करने का यह सबसे अच्छा तरीका नहीं है।

try{ 
    var blog = mongoose.model('blog', Article); 
} catch (error) {} 
2

बेस्ट समाधान (IMO):

try { 
    mongoose.model('config') 
} catch (_) { 
    mongoose.model('config', schema) 
}