एक खाली वस्तु की आवश्यकता है


125

मेरे पास एक फ़ोल्डर है, जिसमें index.js और कुछ मॉडल (कक्षाएं) index.js हैं

module.exports = {
   Book : require('./book'),
   Author : require('./author')
}

book.js

var Author = require('./author')
var Book = models.ActiveRecord.extend({
    schema : {
        belongsTo : {
            author : Author
        }
    }
})
module.exports = Book

author.js

var Book = require('./book')
var Author = models.ActiveRecord.extend({
    schema : {
        hasMany : {
            author : Book
        }
    }
})

module.exports = Author

समस्या यह है कि लेखक वर्ग पुस्तक खोजने के लिए प्रतीत नहीं होता है! यह सिर्फ एक खाली वस्तु है। हालाँकि, अगर मैं लेखक के बाद बुक इंडेक्स.जेएस में निर्यात स्विच करता हूं, तो यह काम करता है, लेकिन फिर दूसरा मॉडल काम करना बंद कर देता है।

मैं इसे काम करने के लिए कोई हैक नहीं करना चाहता।


4
Author.js को चलाने के लिए Book.js की आवश्यकता है, और Book.js को चलने के लिए Author.js की आवश्यकता है? परिपत्र निर्भरता निकालें।
फिलिप गेरेट

1
ActiveRecord ऑब्जेक्ट क्या है? ये कहां से है?
बीटी

जवाबों:


207

ऐसा इसलिए है क्योंकि आपके पास एक परिपत्र निर्भरता है। Node.js इसे बहुत विशिष्ट तरीके से संभालता है:

  1. पहला मॉड्यूल लोड और चलता है (इस मामले में, book.js)। यह ( book.js) author.jsजब दूसरे ( book.js) की आवश्यकता होती है तो दूसरे मॉड्यूल को लोड और चलाएगा ( author.js)

  2. जब दूसरा मॉड्यूल ( author.js) लोड किया जाता है और चलाया जाता है, तो उसे ( author.jsपहले मॉड्यूल की आवश्यकता होती है book.js) लेकिन इसे ( author.js) आंशिक रूप से भरी हुई वस्तु प्राप्त होगी - हालाँकि यह आवश्यक है कि book.js में निर्यात पर कई चीजें निर्धारित की गई थीं। उस वस्तु में रहो

  3. बाद book.jsपूरी तरह से के माध्यम से चलाया जाता है, वस्तु author.jsसे मिला require('./book')भरा होगा book.jsमॉड्यूल वस्तु

अधिक जानकारी के लिए, यहां डॉक्स: http://nodejs.org/api/modules.html

यदि संभव हो तो उस स्कीमा को सक्रिय रूप से उन ActiveRecord ऑब्जेक्ट्स में जोड़ें, तो इसे हल करने का एक तरीका है। यह वास्तव में एक मुश्किल स्थिति है। वास्तव में, यहां तक ​​कि मॉड्यूल प्रणाली के बिना, यह आपके लिए समस्याएं पैदा करेगा। यदि आप यह सब कोड एक फ़ाइल में रखते हैं, तो आप इसे कैसे काम करेंगे?


1
मुझे पता है कि आपको एक फाइल में सब कुछ नहीं डालना चाहिए, लेकिन मैं कह रहा हूं कि ऐसा ही प्रयोग करें। मेरा कहना यह है कि यह नोड.जेएस का मॉड्यूल सिस्टम नहीं है जो यहां समस्या पैदा कर रहा है, यह कोड ही है।
बीटी

और एक तथ्य के रूप में, जावा में समान समस्याएं निर्भरता के साथ हैं - इसकी समस्या किसी भी भाषा में हो सकती है। यदि आप सभी की जरूरत है आप के लिए एक संदर्भ है परिपत्र निर्भरता साथी, जावास्क्रिप्ट यह सिर्फ जावा के रूप में आसानी से कर सकते हैं। हालाँकि, यहाँ, आप इसके निर्माण (विस्तार में) से पहले वस्तु का उपयोग करने की कोशिश कर रहे हैं
बीटी

हाँ, वास्तव में अब मैं इसे समझ गया। कभी खयाल में नहीं आया। तो, केवल एक ही तरीका है - इसे गतिशील रूप से जोड़ने के लिए, मुझे लगता है। या एक स्ट्रिंग के रूप में एक मॉडल का नाम गुजर रहा है। आपके प्रतिक्रिया के लिए धन्येवाद!
user3677173

18
मैं अत्यधिक जटिल मामलों (यानी अधिक फ़ाइलों के साथ) में इस प्रकार के मुद्दों को डीबग करने के लिए मैज की अनुशंसा करता हूं । एक बार स्थापित होने के बाद आप madge -c <app entry point>किसी भी परिपत्र निर्भरता का पता लगाने के लिए उपयोग कर सकते हैं ।
schu34

7
धन्यवाद। बहुत दर्दनाक है कि यह एक त्रुटि भी नहीं है, लेकिन सिर्फ एक खाली वस्तु देता है।
रॉबर्ट ओस्क्लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.