2016-07-03 26 views
13

बिना आवश्यकता मैं इस कोड (जो पूरी तरह से अच्छी तरह से काम करता है) जो मैं एक ऑनलाइन संसाधन से उधार लिया गया है है:का उपयोग करते हुए निर्यात

var express = require('express'); 
var bodyParser = require('body-parser'); 
var logger = require('morgan'); 

var app = express(); 

require('./init/db'); 
require('./init/cache'); //Bring in Redis 

//Define Routes 
var userRoutes = require('./routes/user'); 

module.exports = app; 

बिट मुझे समझ नहीं आता है "की आवश्यकता होती है" जब इस तरह से इस्तेमाल ? यहाँ फ़ाइल में लाता है:

//db.js 
var mongoose = require('mongoose'); 
var dbURI = <theURI>; 

mongoose.connect(dbURI); 

// CONNECTION EVENTS 
mongoose.connection.on('connected', function() { 
    console.log('Mongoose connected successfully'); 
}); 

यह मेरी Redis कनेक्शन के साथ एक ही है:

//cache.js 
var redis = require("redis"); 

var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL); 
redisClient.auth(process.env.CACHE_PASS); 

redisClient.on("ready", function() { 
    console.log("Cache is connected"); 
}); 

लेकिन वहाँ db.js या cache.js फाइलों में कोई module.exports कहीं भी है के रूप में आप देख सकते हैं! जब मैं समझता हूं कि यह कैसे काम करता है यह उदाहरण हमेशा module.exports और require के बारे में बात करता है।

प्रश्न

  1. कोई समझा सकते हैं कि कैसे काम करता है जब इस तरह अपने आप ही इस्तेमाल किया की आवश्यकता होती है?

  2. मैं कैश/Redis कनेक्शन उपलब्ध बनाने कैसे इतना है कि यह मेरी कुछ की तरह का उपयोग कर userRoutes फ़ाइल में इस्तेमाल किया जा सकता कर सकते हैं: var userRoutes = require('./routes/user')(redis);

+0

आप डीबी के संदर्भ के रूप में अन्य मॉड्यूल में उपयोग करने के लिए निश्चित रूप से मोंगोस कनेक्शन निर्यात कर सकते हैं। बस Google इसे (उदाहरण: निर्यात मोंगोस कनेक्शन) और आपको बहुत सारे उदाहरण मिलेंगे। –

+0

मेरा कोड ठीक काम कर रहा है और मैं अपने मार्ग फ़ाइल से डेटाबेस से पूछताछ कर सकता हूं लेकिन मुझे समझ में नहीं आता कि कैसे! – tommyd456

+0

उत्कृष्ट सवाल! पूछने के लिए धन्यवाद। इससे मुझे बहुत सी चीजों को समझने में मदद मिली और मेरा काम पूरा हो गया! – kirtan403

उत्तर

24

कोई समझा सकते हैं क्या इस कोड के साथ हो रहा है? दूसरे शब्दों में, निर्यात के साथ उपयोग नहीं होने पर काम की आवश्यकता कैसे होती है।

हम लगभग के साथ उपयोग किए जाने पर लगभग हमेशा require() देखते हैं, लेकिन आपको यह नहीं करना है। जब आप कुछ भी निर्यात नहीं करते हैं, तो आयातित मॉड्यूल में कोड अभी भी चल जाएगा, लेकिन आप आयात को एक चर में बाध्य नहीं कर सकते हैं और इसके साथ बातचीत कर सकते हैं।

var foo = {}; 

foo.greet = function(){ 
    console.log('Hello from Foo!'); 
} 

foo.greet(); 

मैं तो जैसे मेरी मुख्य फाइल में इस मॉड्यूल आयात कर सकते हैं,:

निम्नलिखित Foo.js मॉड्यूल पर विचार करें

require('./foo'); 

यदि मैं यह मुख्य फ़ाइल, Foo.js मॉड्यूल के अंदर कोड को चलाने भाग जाएगा, और फू से हैलो! कंसोल पर मुद्रित किया जाएगा।

हालांकि, मैं सीधे foo ऑब्जेक्ट से बातचीत नहीं कर सकता। निम्नलिखित कोड काम करेंगे नहीं:

require('./foo'); 
foo.greet(); //ReferenceError, foo is not defined 

मैं एक चर के लिए मॉड्यूल आयात बाध्य कर सकते हैं, लेकिन फिर भी यह काम नहीं करेगा:

var foo = require('./foo'); 
foo.greet(); //TypeError, foo.greet is not a function 

यह काम करने के लिए प्राप्त करने के लिए, मैं foo निर्यात करने के लिए की जरूरत है module.exports का उपयोग करके, जो आप परिचित हैं, मेरे मॉड्यूल से ऑब्जेक्ट करें।

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

आपके प्रश्न में कोड में, रेडिस आयात करना काम करता है क्योंकि वह मॉड्यूल स्वयं निहित है, आपको अपने कोड में इसके साथ बातचीत करने की आवश्यकता नहीं है। आपको केवल कोड आयात करने की आवश्यकता है ताकि वह चल सके (मुख्य रेडिस मॉड्यूल की आवश्यकता है और क्लाइंट बनाएं)

+0

धन्यवाद, यह वास्तव में सहायक है। रेडिस भाग के संबंध में, मुझे 'redisClient' को मेरी' userRoutes' फ़ाइल में उपलब्ध कराने की आवश्यकता है। क्या यह 'cache.js' फ़ाइल के नीचे' module.exports = redisClient' जोड़ने का एक साधारण मामला है? – tommyd456

+0

हां, यदि आप 'redisClient' निर्यात करते हैं और एक चर के लिए' आवश्यकता 'बांधते हैं तो आप उस चर के माध्यम से इसे एक्सेस करने में सक्षम होंगे – Drown

+0

यह इतना अच्छा जवाब है! मैं एक ही फाइल से काम करने के बाद अपने 2 ऐप्स प्राप्त करने के एक दिन से ऐसा कुछ खोज रहा था। उत्तम सामग्री! और शानदार सवाल भी! – kirtan403

2

जब आप require पर कॉल करते हैं तो मॉड्यूल लोड और निष्पादित होता है। तो आपके पास एक जुड़ा हुआ मोन्गोज है। दरअसल require एक ऐसा फ़ंक्शन बनाता है जो आपका संपूर्ण मॉड्यूल कोड इंजेक्शन करता है और आखिरकार चलाता है।

नहीं यदि आप मॉड्यूल में बनाए गए चर का पुन: उपयोग करना चाहते हैं तो आपको इसे निर्यात करना चाहिए। जैसा:

//cache.js 
var redis = require("redis"); 

var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL); 
redisClient.auth(process.env.CACHE_PASS); 

redisClient.on("ready", function() { 
    console.log("Cache is connected"); 
}); 

module.exports = redisClient; 
+0

धन्यवाद, मैंने अभी दूसरे जवाब के लिए एक टिप्पणी जोड़ा जो इस जैसा है। वैसे भी चीयर्स। – tommyd456

0

एक मॉड्यूल शामिल नहीं है कि निर्यात इसे चलाने के लिए आवश्यकता होती है इसके अलावा है दुष्प्रभाव यह भी संभव है एक मॉड्यूल वैश्विक क्षेत्र जो फ़ाइल जहां मॉड्यूल की आवश्यकता है में पहुँचा जा सकता है पर चर निर्धारित करने के लिए। यह var कीवर्ड के बिना वैरिएबल को परिभाषित करके होता है। यह एक अच्छा या सामान्य अभ्यास नहीं है, लेकिन आप इसे कहीं सामना कर सकते हैं इसलिए यह जानना अच्छा है कि क्या हो रहा है।

उदाहरण:

// foo.js 
bar = 5; 

और

// test.js 
require('./foo'); 

console.log(bar); 
// prints 5 

हैं bar के रूप में परिभाषित किया गया था:

var bar = 5; 

यह मॉड्यूल दायरे में हो सकता है और test.js में सुलभ नहीं होना।

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