2013-05-24 4 views
12

मैं NodeJS/expressjs को देख रहा हूँ और देखा है अलग ट्यूटोरियल या तो __diranme + "/my_folder", "./my_folder", या बस "my_folder" का उपयोग करें।नोड js/एक्सप्रेस js संबंधित पथ (डॉट या __dirname या किसी उपसर्ग के बिना)?

उदाहरण:

app.use("/static", express.static(__dirname + "/my_folder")); 
app.use("/static", express.static("./my_folder")); 
app.use("/static", express.static("my_folder")); 

मैं उन सभी की कोशिश की और वे सब काम करने के लिए पसंद करते हैं; मुझे किस सापेक्ष पथ के लिए उपयोग करना चाहिए?

मैं भी require('./my_file.js') और require('my_file') देखा है। क्या कोई अंतर है? मुझे क्या उपयोग करना चाहिए?

+0

मैं स्थानों को परिभाषित करने के लिए Windows पर टूट जाएगा के अंतिम रास्ता विश्वास करते हैं। मैं '__dirname + '/ folder'' का उपयोग कर 90% हूं, सबसे सुरक्षित दृष्टिकोण है (बिना ठोस साक्ष्य के, केवल यादृच्छिक अनुभव विंडोज़ में नोड के साथ गड़बड़ कर रहा है)। –

उत्तर

15

लगभग कोई भी फ़ंक्शन (require को छोड़कर) जो फ़ाइल पथ को तर्क के रूप में लेता है, एक बिंदु पर fs मॉड्यूल से पढ़ने या लिखने के लिए एक बिंदु का उपयोग करेगा।

Node.js documentation for fs module का कहना है:

फ़ाइल नाम के सापेक्ष पथ, इस्तेमाल किया जा सकता है लेकिन याद रखें कि यह पथ process.cwd के सापेक्ष किया जाएगा()।

जब आप इसके बारे में सोचते हैं, तो इन कार्यों को किसी भी अलग तरीके से व्यवहार करने के लिए प्रमुख चालबाजी की आवश्यकता होगी। आखिरकार, एफएस फ़ंक्शन नियमित जावास्क्रिप्ट होते हैं और उनके पास कॉलर के बारे में जानकारी तक विशेष पहुंच नहीं होती है। केवल __dirname वे यहां पहुंच सकता है अपने स्वयं के मॉड्यूल (कोर FS मॉड्यूल) के __dirname होगा।

तथ्य यह है कि require समारोह कर सकते हैं संकल्प पथ वर्तमान __dirname के सापेक्ष, इस स्पष्ट रूप से निर्दिष्ट किए बिना, क्योंकि require हर एक फ़ाइल में प्रकट होता है। इस तरह के लिए एक अनूठा समारोह है यह वर्तमान की पहुंच है मॉड्यूल के विनिर्देश, और विशेष रूप से इसके पथ।

आपका कोड काम करने के कारण होने का कारण यह है कि वर्तमान में app.js (या समान) उपरोक्त कोड उसी निर्देशिका में होता है जैसा वर्तमान में process.cwd() है। अर्थात। node app.js के साथ ऐप शुरू करना node myappdir/app.js (इसकी मूल निर्देशिका से भाग गया) के साथ ऐप शुरू करते समय काम करेगा। process.cwd() अलग होगा।

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

+0

धन्यवाद, बहुत जानकारीपूर्ण। इसलिए यदि मैं समझता हूं: 'आवश्यकता' हमेशा मौजूदा फ़ाइल के सापेक्ष होगी ('dot' या' __dirname' का उपयोग करके)। अन्य सभी पथ - जो शायद 'एफएस' के माध्यम से जाते हैं, '__dirname' – Raekye

+1

के साथ पारित होने पर कॉलिंग फ़ाइल के सापेक्ष 'डॉट' के साथ प्रक्रिया के सापेक्ष हो सकते हैं। लेकिन कुछ पथ "__dirname +" कर रहे हैं "केवल नियमित स्ट्रिंग concatenation है। यह एक समारोह या तो कॉल करने का एक विशेष तरीका है। यह व्याख्या के लिए किसी भी कमरे को छोड़कर, एक पूर्ण पथ में परिणाम देता है। –

0

मैं app.use(express.static(path.join(__dirname, 'public'))); जो मैं तो जो मेरे द्वारा

<link rel="stylesheet" href="/stylesheets/jquery-ui.css" /> 
    <script type="text/javascript" src="/javascripts/jquery-1.9.1.js"></script> 

./myfolder दृष्टिकोण मेरा मानना ​​है कि अनिवार्य रूप से एक ही बात है उन स्थिर फ़ाइलों को एक्सेस करने की अनुमति देता है मेरी सार्वजनिक, स्टाइलशीट, javascripts और छवियों के अंदर तीन फ़ोल्डर का उपयोग करें। मैने इसे कभी इस्तेमाल नहीं किया है।
/myfolder दृष्टिकोण मैं कभी नहीं देखा है।

require('./my_file.js') I use as 
    require('./routes/my_file.js') aand is where I store all my express routes. 

require('myfile') संकुल आपके द्वारा इंस्टॉल या एक्सप्रेस के साथ स्थापित आने के लिए एक फोन है।

4

__dirname संस्करण सबसे मजबूत है, क्योंकि __dirname हमेशा जो "my_folder" या "./my_folder" जो दोनों संबंधित पथ कर रहे हैं और असफल हो जायेगी तुलना में एक बेहतर लंगर है वर्तमान में क्रियान्वित .js फ़ाइल युक्त निर्देशिका, हो सकता है अगर इस प्रक्रिया के वर्तमान कार्यशील निर्देशिका (process.cwd()) कुछ अप्रत्याशित है, जो पूरी तरह से संभव है।

ध्यान दें कि यह require के लिए पारित किया पथ के लिए एक अलग कहानी है, संबंधित पथ के बाद से वहाँ प्रक्रिया के वर्तमान कार्यशील निर्देशिका के लिए संबंध के बिना बुला मॉड्यूल के स्थान के सापेक्ष हल कर रहे हैं (फिर से, यह उन्हें कम नाजुक करता है)।

+0

आवश्यकता के लिए, क्या मुझे एक्सटेंशन शामिल करना चाहिए? जैसे कि मैंने अक्सर देख 'आवश्यकता होती है (__ dirname +"/कुछ ")' लेकिन क्यों नहीं 'आवश्यकता होती है (__ diranem +" /something.js ")' (जो भी काम करने लगता है)? – Raekye

+0

संपादित करें: मिला 'तो सटीक फ़ाइल नाम नहीं मिला है, तो नोड .js, .json का जोड़ा विस्तार के साथ आवश्यक फ़ाइल नाम लोड करने का प्रयास करेंगे, और फिर डॉक्स पर .node.' (पहले यह याद किया, पाया यह देख कुछ और के लिए)। तो अब मैं जानता हूँ कि यह कैसे काम करता है, लेकिन आपको लगता है कि यह एक अच्छी आदत है स्पष्ट या ... अंतर्निहित (मुझे अजगर xD की याद दिलाता है) – Raekye

+0

सम्मेलन किसी फ़ाइल नाम (छुपा हुआ) है होना करने के लिए करते हैं और मुझे लगता है कि यह अच्छी बात है। आप 'module.js' से 'मॉड्यूल/index.js' पर भी स्विच कर सकते हैं और आपकी लाइब्रेरी का उपयोग करने वाले प्रोग्रामों को देखभाल या अद्यतन नहीं करना पड़ता है। –

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