एक्सप्रेसजेएस एक आवेदन की संरचना कैसे करें?


527

मैं NodeJS के लिए ExpressJS वेब फ्रेमवर्क का उपयोग कर रहा हूं।

एक्सप्रेसजेएस का उपयोग करने वाले लोग अपने वातावरण (विकास, उत्पादन, परीक्षण ...), अपने मार्गों आदि पर डालते हैं app.js। मुझे लगता है कि यह एक सुंदर तरीका नहीं है क्योंकि जब आपके पास एक बड़ा एप्लिकेशन होता है, तो app.js बहुत बड़ा होता है!

मुझे यह निर्देशिका संरचना पसंद है:

| my-application
| -- app.js
| -- config/
     | -- environment.js
     | -- routes.js

यहाँ मेरा कोड है:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/environment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

config / environment.js

module.exports = function(app, express){
    app.configure(function() {
    app.use(express.logger());
    });

    app.configure('development', function() {
    app.use(express.errorHandler({
        dumpExceptions: true,
        showStack: true
    }));
    });

    app.configure('production', function() {
    app.use(express.errorHandler());
    });
};

config / routes.js

module.exports = function(app) {
    app.get('/', function(req, res) {
    res.send('Hello world !');
    });
};

मेरा कोड अच्छी तरह से काम करता है और मुझे लगता है कि निर्देशिकाओं की संरचना सुंदर है। हालाँकि, कोड को अनुकूलित किया जाना था और मुझे यकीन नहीं है कि यह अच्छा / सुंदर है।

क्या निर्देशिकाओं की मेरी संरचना का उपयोग करना और कोड को अनुकूलित करना या केवल एक फ़ाइल (app.js) का उपयोग करना बेहतर है?

आपकी सलाह के लिए धन्यवाद!


क्या इस तरह के प्रदर्शन के मुद्दे अभी भी आस-पास दुबके हुए हैं? मुझे याद है कि कहीं न कहीं (शायद एक्सप्रेस समूह) को पढ़ते हुए जब आप इस तरह से सब कुछ अलग करते हैं, तो आप एक टन का प्रदर्शन खो देते हैं। आपके रेक्स / सेकंड की तरह कुछ ध्यान देने योग्य राशि से गिर जाएगा, लगभग जैसे कि यह एक बग था।
एंटीलोप्सलाड

2
यह एक्सप्रेस Google समूह से था। यहां लिंक दिया गया है: group.google.com/group/express-js/browse_thread/thread/…
एंटीलोपसलाड

52
नहीं, यह बहुत असत्य है
tjholowaychuk

जवाबों:


306

ठीक है, यह एक समय हो गया है और यह एक लोकप्रिय सवाल है, इसलिए मैंने आगे बढ़कर जावास्क्रिप्ट कोड के साथ एक मचान गिथब रिपॉजिटरी बनाई है और एक लंबे समय के बारे में पढ़ें कि मैं कैसे एक मध्यम आकार के एक्सप्रेस.जेएस एप्लिकेशन को संरचना करना पसंद करता हूं।

फ़ोकसॉरस / एक्सप्रेस_कोड_स्ट्रक्चर इसके लिए नवीनतम कोड वाला रेपो है। अनुरोध का स्वागत करें।

यहाँ README का एक स्नैपशॉट है क्योंकि स्टैकओवरफ़्लो सिर्फ-ए-लिंक उत्तरों को पसंद नहीं करता है। मैं कुछ अपडेट करूंगा क्योंकि यह एक नई परियोजना है जिसे मैं अपडेट करना जारी रखूंगा, लेकिन आखिरकार इस जानकारी के लिए गिटब रेपो अप-टू-डेट जगह होगी।


एक्सप्रेस कोड संरचना

यह प्रोजेक्ट मध्यम आकार के एक्सप्रेस.जेएस वेब एप्लिकेशन को व्यवस्थित करने का एक उदाहरण है।

कम से कम एक्सप्रेस v4.14 दिसंबर 2016 को वर्तमान

स्थिति बनाएँ

js मानक शैली

आपका आवेदन कितना बड़ा है?

वेब एप्लिकेशन सभी समान नहीं हैं, और मेरी राय में, एक भी कोड संरचना नहीं है, जिसे सभी एक्सप्रेस.जेएस अनुप्रयोगों पर लागू किया जाना चाहिए।

यदि आपका आवेदन छोटा है, तो आपको इस तरह की गहरी निर्देशिका संरचना की आवश्यकता नहीं है क्योंकि यहाँ पर उदाहरण दिया गया है। बस इसे सरल रखें और .jsअपनी रिपॉजिटरी की जड़ में मुट्ठी भर फाइलें चिपकाएँ और आपका काम हो गया। Voilà।

यदि आपका आवेदन बहुत बड़ा है, तो कुछ बिंदु पर आपको इसे अलग-अलग एनपीएम पैकेज में तोड़ने की आवश्यकता है। सामान्य तौर पर नोड.जेएस दृष्टिकोण कई छोटे पैकेजों के पक्ष में लगता है, कम से कम पुस्तकालयों के लिए, और आपको कई एनपीएम पैकेजों का उपयोग करके अपने आवेदन का निर्माण करना चाहिए क्योंकि यह समझ में आने लगता है और ओवरहेड को उचित ठहराना शुरू करता है। इसलिए जैसे-जैसे आपका एप्लिकेशन बढ़ता है और कोड का कुछ हिस्सा आपके एप्लिकेशन के बाहर स्पष्ट रूप से पुन: प्रयोज्य हो जाता है या एक स्पष्ट सबसिस्टम है, इसे अपने स्वयं के गिट रिपॉजिटरी में स्थानांतरित करें और इसे स्टैंडअलोन एनपीएम पैकेज में बनाएं।

इसलिए इस परियोजना का फोकस मध्यम आकार के अनुप्रयोग के लिए एक व्यावहारिक संरचना का वर्णन करना है।

आपकी समग्र वास्तुकला क्या है

वेब एप्लिकेशन बनाने के लिए कई दृष्टिकोण हैं, जैसे कि

  • सर्वर साइड MVC रेल पर एक ला रूबी
  • सिंगल पेज एप्लीकेशन स्टाइल अ ला मोंगोबडी / एक्सप्रेस / एंगुलर / नोड (MEAN)
  • कुछ रूपों के साथ मूल वेब साइट
  • मॉडल / संचालन / दृश्य / घटना शैली एक ला एमवीसी मर चुका है, यह समय के लिए चलता है
  • और कई अन्य दोनों वर्तमान और ऐतिहासिक हैं

इनमें से प्रत्येक एक अलग निर्देशिका संरचना में अच्छी तरह से फिट बैठता है। इस उदाहरण के प्रयोजनों के लिए, यह सिर्फ मचान है और पूरी तरह से काम करने वाला ऐप नहीं है, लेकिन मैं निम्नलिखित प्रमुख वास्तुकला बिंदुओं को मान रहा हूं:

  • साइट में कुछ पारंपरिक स्थिर पृष्ठ / टेम्पलेट हैं
  • साइट के "एप्लिकेशन" भाग को सिंगल पेज एप्लिकेशन शैली के रूप में विकसित किया गया है
  • एप्लिकेशन ब्राउज़र के लिए एक REST / JSON शैली API को उजागर करता है
  • ऐप एक साधारण व्यापार डोमेन को मॉडल करता है, इस मामले में, यह एक कार डीलरशिप एप्लीकेशन है

और पटरियों पर रूबी के बारे में क्या?

इस परियोजना के दौरान यह एक विषय होगा कि रूबी ऑन रेल्स और "कन्वेंशन ओवर कॉन्फिगरेशन" निर्णयों में से कई विचारों को उन्होंने अपनाया है, हालांकि व्यापक रूप से स्वीकार किए जाते हैं और उपयोग किए जाते हैं, वास्तव में बहुत सहायक नहीं होते हैं और कभी-कभी इस रिपॉजिटरी के विपरीत होते हैं। सिफारिश की गई है।

यहां मेरा मुख्य बिंदु यह है कि कोड को व्यवस्थित करने के लिए अंतर्निहित सिद्धांत हैं, और उन सिद्धांतों के आधार पर, रूल्स ऑन रूब कन्वेंशन रूल्स समुदाय पर रूबी के लिए (ज्यादातर) समझ में आता है। हालांकि, बस विचारहीन रूप से उन सम्मेलनों को क्षमा करने से बात याद आती है। एक बार जब आप मूल सिद्धांतों को टटोलते हैं, तो आपकी सभी परियोजनाएँ सुव्यवस्थित और स्पष्ट होंगी: शेल स्क्रिप्ट, गेम्स, मोबाइल ऐप, एंटरप्राइज़ प्रोजेक्ट, यहां तक ​​कि आपके होम डायरेक्टरी भी।

रेल समुदाय के लिए, वे चाहते हैं कि वे हर बार ऐप से ऐप में एक ही रेल डेवलपर स्विच करें और हर बार इससे परिचित और सहज रहें। यह बहुत मायने रखता है यदि आप 37 सिग्नल या पॉस्टल लैब्स हैं, और इसके फायदे हैं। सर्वर-साइड जावास्क्रिप्ट दुनिया में, समग्र लोकाचार सिर्फ अधिक जंगली पश्चिम कुछ भी हो जाता है और हमें वास्तव में इसके साथ कोई समस्या नहीं है। हम इस तरह करते हैं। हम इसके अभ्यस्त हैं। यहां तक ​​कि एक्सप्रेस.जे के भीतर, यह सिनट्रा के करीबी परिजन हैं, न कि रेल, और रेल से सम्मेलनों को लेना आमतौर पर कुछ भी मदद नहीं कर रहा है। मैं यह भी कहूंगा कि कॉन्फ़िगरेशन पर कन्वेंशन पर सिद्धांत

सिद्धांतों और प्रेरणाओं को समझना

  • मानसिक रूप से प्रबंधनीय हो
    • मस्तिष्क केवल एक ही बार में संबंधित चीजों की एक छोटी संख्या के साथ सौदा कर सकता है और सोच सकता है। इसलिए हम निर्देशिका का उपयोग करते हैं। यह हमें छोटे भागों पर ध्यान केंद्रित करके जटिलता से निपटने में मदद करता है।
  • आकार-उचित हो
    • "मैंशन डिरेक्टरीज़" न बनाएं जहाँ पर केवल 1 फ़ाइल हो, सभी 3 डाइरेक्टरी नीचे। आप इसे एंसेबल बेस्ट प्रैक्टिसेस में होते हुए देख सकते हैं, जो 10+ डायरेक्टरी बनाने के लिए छोटे प्रोजेक्ट्स को हिलाता है, 10+ फाइल्स रखने के लिए जब 1 डायरेक्टरी 3 फाइल्स के साथ ज्यादा उपयुक्त होगी। आप काम करने के लिए एक बस नहीं चलाते हैं (जब तक कि आप बस चालक नहीं हैं, लेकिन तब भी आपकी बस ड्राइविंग का काम नहीं करती है), इसलिए फाइलसिस्टम संरचनाएं न बनाएं जो उनके अंदर वास्तविक फाइलों द्वारा उचित नहीं हैं ।
  • मॉड्यूलर हो लेकिन व्यावहारिक हो
    • नोड समुदाय कुल मिलाकर छोटे मॉड्यूल का पक्षधर है। जो कुछ भी आपके ऐप से सफाई से अलग हो सकता है, उसे पूरी तरह से आंतरिक उपयोग के लिए या सार्वजनिक रूप से npm पर प्रकाशित किया जाना चाहिए। हालाँकि, मध्यम-आकार के अनुप्रयोगों के लिए जो कि यहाँ गुंजाइश है, इस के उपरिमार्ग में आपके वर्कफ़्लो के बिना कमोडोरियल वैल्यू के बिना टेडियम को जोड़ा जा सकता है। तो उस समय के लिए जब आपके पास कुछ ऐसा कोड होता है जो वास्तव में अलग होता है लेकिन पूरी तरह से अलग npm मॉड्यूल का औचित्य साबित करने के लिए पर्याप्त नहीं होता है, बस इसे " प्रोटो-मॉड्यूल " के रूप में इस उम्मीद के साथ समझें कि जब यह कुछ आकार सीमा को पार करता है, तो इसे बाहर निकाला जाएगा।
    • कुछ लोगों जैसे @ hij1nx में भी एक app/node_modulesनिर्देशिका शामिल है और उस संक्रमण को सुविधाजनक बनाने और अनुस्मारक के रूप में कार्य करने के package.jsonलिए प्रोटो-मॉड्यूल निर्देशिकाओं में फाइलें हैं ।
  • कोड का पता लगाना आसान हो
    • निर्माण करने के लिए या फिक्स करने के लिए एक बग को देखते हुए, हमारा लक्ष्य यह है कि एक डेवलपर को शामिल फ़ाइलों को खोजने में कोई संघर्ष न हो।
    • नाम सार्थक और सटीक हैं
    • crufty कोड पूरी तरह से हटा दिया गया है, एक अनाथ फ़ाइल में चारों ओर नहीं छोड़ा गया है या केवल टिप्पणी नहीं की गई है
  • खोज के अनुकूल हो
    • सभी प्रथम-पक्ष स्रोत कोड appनिर्देशिका में हैं, ताकि आप cdवहाँ मिल जाए / grep / xargs / ag / ack / etc चलाएं और तीसरे पक्ष के मैचों से विचलित न हों
  • सरल और स्पष्ट नामकरण का उपयोग करें
    • npm को अब सभी-लोअरकेस पैकेज नामों की आवश्यकता है। मुझे यह सबसे भयानक लगता है, लेकिन मुझे झुंड का पालन करना चाहिए, इस प्रकार फ़ाइल नाम का उपयोग करना चाहिए, kebab-caseभले ही इसके लिए जावास्क्रिप्ट में चर नाम होना चाहिए camelCaseक्योंकि जावास्क्रिप्ट -में एक शून्य चिह्न है।
    • परिवर्तनशील नाम मॉड्यूल पथ के बेसनेम से मेल खाता है, लेकिन इसके साथ kebab-caseरूपांतरित हो गया हैcamelCase
  • समूह युग्मन द्वारा, फ़ंक्शन द्वारा नहीं
    • यह रूबी ऑन रेल्स के सम्मेलन से एक प्रमुख प्रस्थान है app/views, app/controllers, app/models, आदि
    • सुविधाओं को एक पूर्ण स्टैक में जोड़ा जाता है, इसलिए मैं उन फ़ाइलों के पूर्ण स्टैक पर ध्यान केंद्रित करना चाहता हूं जो मेरी सुविधा के लिए प्रासंगिक हैं। जब मैं उपयोगकर्ता मॉडल के लिए एक टेलीफोन नंबर फ़ील्ड जोड़ रहा हूं, तो मुझे उपयोगकर्ता नियंत्रक के अलावा किसी भी नियंत्रक के बारे में परवाह नहीं है, और मैं उपयोगकर्ता मॉडल के अलावा किसी भी मॉडल के बारे में परवाह नहीं करता हूं।
    • इसलिए 6 फाइलों को संपादित करने के बजाय जो कि उनकी अपनी निर्देशिका में हैं और उन निर्देशिकाओं में अन्य फ़ाइलों की अनदेखी कर रहे हैं, इस रिपॉजिटरी का आयोजन इस प्रकार किया जाता है कि सभी फाइलों को एक फीचर बनाने की आवश्यकता होती है।
    • MVC की प्रकृति से, उपयोगकर्ता दृश्य उपयोगकर्ता नियंत्रक से युग्मित होता है जो उपयोगकर्ता मॉडल के लिए युग्मित होता है। इसलिए जब मैं उपयोगकर्ता मॉडल को बदलता हूं, तो वे 3 फाइलें अक्सर एक साथ बदल जाएंगी, लेकिन सौदों नियंत्रक या ग्राहक नियंत्रक को डिकूप किया जाता है और इस प्रकार शामिल नहीं होता है। समान रूप से गैर-एमवीसी डिजाइनों पर भी लागू होता है।
    • किस कोड में मॉड्यूल अभी भी प्रोत्साहित किया जाता है, इस संदर्भ में एमवीसी या एमओडब्ल्यूवाई स्टाइल डिकॉप्लिंग करता है, लेकिन एमवीसी फाइलों को बाहर फैलाना सिर्फ कष्टप्रद है।
    • इस प्रकार मेरे प्रत्येक रूट फाइलों में उन रूटों का हिस्सा होता है जो उसके मालिक हैं। routes.rbयदि आप ऐप में सभी मार्गों का अवलोकन चाहते हैं, तो रेल-स्टाइल फ़ाइल आसान है, लेकिन जब वास्तव में सुविधाओं का निर्माण और बग को ठीक करते हैं, तो आप केवल उस टुकड़े के लिए प्रासंगिक मार्गों की परवाह करते हैं जो आप बदल रहे हैं।
  • कोड के बगल में परीक्षण स्टोर करें
    • यह "समूह द्वारा युग्मन" का एक उदाहरण है, लेकिन मैं इसे विशेष रूप से कॉल करना चाहता था। मैंने कई परियोजनाएँ लिखी हैं जहाँ परीक्षण एक समानांतर फाइलसिस्टम के अंतर्गत रहते हैं जिन्हें "परीक्षण" कहा जाता है और अब जब मैंने अपने परीक्षणों को उनके संबंधित कोड के रूप में उसी निर्देशिका में रखना शुरू कर दिया है, तो मैं कभी पीछे नहीं हटूंगा। यह पाठ संपादकों के साथ काम करने के लिए अधिक मॉड्यूलर और बहुत आसान है और बहुत सारे "../..// .." पथ बकवास को कम करता है। यदि आप संदेह में हैं, तो इसे कुछ परियोजनाओं पर आज़माएं और अपने लिए निर्णय लें। मैं आपको समझाने के लिए इससे आगे कुछ नहीं करने जा रहा हूं कि यह बेहतर है।
  • घटनाओं के साथ क्रॉस-कटिंग युग्मन को कम करें
    • यह सोचना आसान है "ठीक है, जब भी कोई नई डील बनती है, मैं सभी सैलस्पाइस लोगों को एक ईमेल भेजना चाहता हूं", और फिर उन ईमेल को रूट बनाने वाले कोड भेजने के लिए कोड डालते हैं।
    • हालांकि, यह युग्मन अंततः आपके ऐप को मिट्टी की एक विशाल गेंद में बदल देगा।
    • इसके बजाय, DealModel को बस एक "क्रिएट" ईवेंट को फायर करना चाहिए और पूरी तरह से इस बात से अनजान होना चाहिए कि सिस्टम उसके जवाब में क्या कर सकता है।
    • जब आप इस तरह से कोड करते हैं, तो उपयोगकर्ता से संबंधित सभी कोड डालना बहुत अधिक संभव हो जाता है app/usersक्योंकि उपयोगकर्ता कोड आधार की शुद्धता को प्रदूषित करने वाले स्थान पर युग्मित व्यापार तर्क के बारे में एक चूहे का घोंसला नहीं है।
  • कोड प्रवाह का अनुसरण करने योग्य है
    • जादू की बातें मत करो। फाइल सिस्टम में मैजिक डायरेक्टरीज़ से ऑटोलॉड फाइल न करें। रेल मत बनो। एप्लिकेशन शुरू होता है app/server.js:1और आप कोड का पालन करके इसे लोड और निष्पादित करते हुए सब कुछ देख सकते हैं।
    • अपने मार्गों के लिए DSLs न बनाएं। जब यह नहीं बुलाया जाता है तो मूर्खतापूर्ण रूप से मेटाफ़ॉर्मिंग न करें।
    • यदि आपका ऐप इतना बड़ा कर रही है magicRESTRouter.route(somecontroller, {except: 'POST'})एक बड़ी जीत है के लिए तुम पर 3 बुनियादी app.get, app.put, app.del, कॉल, तो आप शायद कि प्रभावी रूप से पर काम करने की बहुत बड़ी है एक अखंड एप्लिकेशन बना रहे हैं। BIG जीत के लिए फैंसी प्राप्त करें, 3 सरल लाइनों को 1 जटिल रेखा में परिवर्तित करने के लिए नहीं।
  • लोअर-कबाब-केस फाइलनाम का उपयोग करें

    • यह प्रारूप प्लेटफ़ॉर्म के दौरान फ़ाइल सिस्टम केस संवेदनशीलता के मुद्दों से बचा जाता है
    • npm नए पैकेज नामों में अपरकेस को मना करता है, और इसके साथ यह अच्छी तरह से काम करता है

      express.js की बारीकियां

  • उपयोग न करें app.configure। यह लगभग पूरी तरह से बेकार है और आपको इसकी आवश्यकता नहीं है। यह नासमझ कोपिस्टा के कारण बहुत सारे बॉयलरप्लेट में है।

  • मध्य प्रदेश के MIDDLEWARE और मार्गों का क्रम !!!
    • लगभग हर रूटिंग समस्या जो मुझे स्टैकओवरफ्लो पर दिखाई देती है, वह आउट-ऑफ-ऑर्डर एक्सप्रेस मिडलवेयर है
    • सामान्य तौर पर, आप चाहते हैं कि आपके मार्ग क्रमबद्ध हों और उस क्रम पर निर्भर न हों
    • app.useअपने पूरे आवेदन के लिए उपयोग न करें यदि आपको वास्तव में केवल 2 मार्गों के लिए मिडलवेयर की आवश्यकता है (मैं आपको देख रहा हूं, body-parser)
    • सुनिश्चित करें कि जब सभी ने कहा है और किया है, तो आपके पास यह आदेश है:
      1. कोई भी सुपर-महत्वपूर्ण एप्लिकेशन-वाइड मिडलवेयर
      2. अपने सभी मार्गों और मिश्रित मार्ग के मध्यवार
      3. जब त्रुटि संचालकों
  • अफसोस की बात है कि पाप-यात्रा-प्रेरित होने के नाते, एक्सप्रेस .js ज्यादातर मानते हैं कि आपके सभी मार्ग अंदर होंगे server.jsऔर यह स्पष्ट होगा कि उन्हें कैसे आदेश दिया जाता है। मध्यम-आकार के अनुप्रयोग के लिए, अलग-अलग मार्गों के मॉड्यूल में चीजों को तोड़ना अच्छा है, लेकिन यह आउट-ऑफ-ऑर्डर मिडलवेयर की गड़बड़ी का परिचय देता है

ऐप सिमिलिंक ट्रिक

महान दृष्टिकोण में समुदाय द्वारा लंबाई पर कई दृष्टिकोणों की रूपरेखा और चर्चा की गई है। बेहतर स्थानीय आवश्यकता () के लिए Node.js के रास्ते हैं । मैं जल्द ही या तो "बहुत सारे ../../../ .." से निपटना पसंद करने का फैसला कर सकता हूं या आवश्यकता के अनुरूप तरीके का उपयोग कर सकता हूं। हालाँकि, इस समय, मैं नीचे दिए गए सिम्लिंक ट्रिक का उपयोग कर रहा हूं।

इसलिए इंट्रा-प्रोजेक्ट से बचने का एक तरीका कष्टप्रद सापेक्ष रास्तों की आवश्यकता है जैसे require("../../../config")निम्नलिखित चाल का उपयोग करना है:

  • अपने ऐप के लिए node_modules के तहत एक सिमलिंक बनाएं
    • सीडी नोड_मॉड्यूल्स और& ln -nsf ../app
  • केवल नोड_मॉड्यूल्स / ऐप सिमिलिंक जोड़ें , न कि संपूर्ण नोड_मॉडल फ़ोल्डर, गिट करने के लिए
    • git ऐड-ऑफ नोड_मॉड्यूल्स / ऐप
    • हां, आपको अभी भी अपनी .gitignoreफ़ाइल में "node_modules" होना चाहिए
    • नहीं, आपको अपने नोड रिपॉजिटरी में "node_modules" नहीं डालना चाहिए। कुछ लोग आपको ऐसा करने की सलाह देंगे। वे गलत हैं।
  • अब आपको इस उपसर्ग का उपयोग करके इंट्रा-प्रोजेक्ट मॉड्यूल की आवश्यकता हो सकती है
    • var config = require("app/config");
    • var DealModel = require("app/deals/deal-model");
  • मूल रूप से, यह इंट्रा-प्रोजेक्ट बाहरी npm मॉड्यूल के लिए आवश्यक समान काम की आवश्यकता है।
  • क्षमा करें, विंडोज उपयोगकर्ता, आपको मूल निर्देशिका रिश्तेदार पथों के साथ रहना होगा।

विन्यास

आमतौर पर कोड मॉड्यूल और कक्षाएं केवल एक मूल जावास्क्रिप्ट optionsऑब्जेक्ट के पास होने की उम्मीद करते हैं । केवल मॉड्यूल app/server.jsको लोड करना चाहिए app/config.js। वहां से यह आवश्यकतानुसार छोटी optionsवस्तुओं को सबसिस्टम को कॉन्फ़िगर करने के लिए संश्लेषित कर सकता है , लेकिन अतिरिक्त जानकारी से भरे बड़े वैश्विक कॉन्फिगरेशन मॉड्यूल के लिए हर सबसिस्टम को खराब करना है।

डीबी कनेक्शनों के निर्माण को केंद्रीकृत करने की कोशिश करें और उन सबसिस्टमों में पास करें जो कि कनेक्शन मापदंडों को पारित करने के विरोध में हैं और सबसिस्टमों के आउटगोइंग कनेक्शन खुद बनाते हैं।

NODE_ENV

यह एक और मोहक लेकिन भयानक विचार है जिसे रेल से चलाया जाता है। आपके एप्लिकेशन में ठीक 1 स्थान होना चाहिए, app/config.jsजो NODE_ENVपर्यावरण चर को देखता है । क्लास कंस्ट्रक्टर तर्क या मॉड्यूल कॉन्फ़िगरेशन पैरामीटर के रूप में बाकी सब कुछ स्पष्ट विकल्प लेना चाहिए।

यदि ईमेल मॉड्यूल में ईमेल वितरित करने का तरीका (SMTP, लॉग इन स्टैडआउट, कतार में रखा आदि) का विकल्प है, तो इसे एक विकल्प लेना चाहिए {deliver: 'stdout'} लेकिन यह बिल्कुल जाँच नहीं करना चाहिए NODE_ENV

टेस्ट

अब मैं अपनी परीक्षण फाइलों को उनके संबंधित कोड के समान निर्देशिका में रखता हूं और उत्पादन कोड से परीक्षणों को अलग करने के लिए फ़ाइल नाम एक्सटेंशन नामकरण सम्मेलनों का उपयोग करता हूं।

  • foo.js मॉड्यूल "फू" कोड है
  • foo.tape.js फू के लिए नोड-आधारित परीक्षण हैं और एक ही डायर में रहते हैं
  • foo.btape.js उन परीक्षणों के लिए उपयोग किया जा सकता है जिन्हें ब्राउज़र वातावरण में निष्पादित करने की आवश्यकता होती है

मैं find . -name '*.tape.js'अपने सभी परीक्षणों तक आवश्यक रूप से पहुंचने के लिए फाइलसिस्टम ग्लब्स और कमांड का उपयोग करता हूं।

प्रत्येक .jsमॉड्यूल फ़ाइल के भीतर कोड को कैसे व्यवस्थित करें

इस परियोजना का दायरा ज्यादातर इस बारे में है कि फाइलें और निर्देशिकाएं कहां जाती हैं, और मैं बहुत अधिक गुंजाइश नहीं जोड़ना चाहता, लेकिन मैं सिर्फ यह उल्लेख करूंगा कि मैं अपने कोड को 3 अलग-अलग वर्गों में व्यवस्थित करता हूं।

  1. कॉमनजेएस के ओपनिंग ब्लॉक में राज्य निर्भरता के लिए कॉल की आवश्यकता होती है
  2. शुद्ध-जावास्क्रिप्ट का मुख्य कोड ब्लॉक। यहां कॉमनज प्रदूषण नहीं। निर्यात, मॉड्यूल या आवश्यकता का संदर्भ न लें।
  3. निर्यात स्थापित करने के लिए कॉमनजस का समापन ब्लॉक

1
मुझे बॉडीपारर के बजाय क्या उपयोग करना चाहिए यदि मेरे पास केवल कुछ ही मार्ग हैं जो इसका उपयोग करते हैं?
इलन फ्रुमर

3
मैंने पाया कि मैं यहाँ क्या देख रहा था: stackoverflow.com/questions/12418372/…
इलन फ्रुमर

1
@wlingke की जाँच gist.github.com/branneman/8048520 है कि समस्या के लिए उपलब्ध दृष्टिकोण की एक गहन विचार विमर्श के लिए।
पीटर लियोन

@peterLyons साझा करने के लिए धन्यवाद। के माध्यम से पढ़ने के बाद, मुझे लगता है कि मैं एक स्टार्टअप स्क्रिप्ट लिखूंगा। धन्यवाद!
वलिंगके

2
ऐप सिमलिंक ट्रिक के संबंध में , यह छोटा मॉड्यूल है जो सभी समस्याओं को दूर करता है
हायको कोरयुन

157

अद्यतन (2013-10-29) : कृपया मेरे अन्य उत्तर को भी देखें जिसमें लोकप्रिय मांग द्वारा कॉफीस्क्रिप्ट के बजाय जावास्क्रिप्ट के साथ-साथ बॉयलरप्लेट जीथब रेपो और एक व्यापक README है जो इस विषय पर मेरी नवीनतम सिफारिशों का विवरण दे रहा है।

कॉन्फ़िग

आप जो कर रहे हैं वह ठीक है। मुझे अपने स्वयं के नेमस्पेस नाम की जगह config.coffeeएक नेस्टेड नेमस्पेस के साथ एक शीर्ष-स्तरीय फ़ाइल में स्थापित करना है ।

#Set the current environment to true in the env object
currentEnv = process.env.NODE_ENV or 'development'
exports.appName = "MyApp"
exports.env =
  production: false
  staging: false
  test: false
  development: false
exports.env[currentEnv] = true
exports.log =
  path: __dirname + "/var/log/app_#{currentEnv}.log"
exports.server =
  port: 9600
  #In staging and production, listen loopback. nginx listens on the network.
  ip: '127.0.0.1'
if currentEnv not in ['production', 'staging']
  exports.enableTests = true
  #Listen on all IPs in dev/test (for testing from other machines)
  exports.server.ip = '0.0.0.0'
exports.db =
  URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"

यह sysadmin संपादन के लिए अनुकूल है। तब जब मुझे कुछ चाहिए, जैसे DB कनेक्शन की जानकारी, यह `

require('./config').db.URL

मार्गों / नियंत्रकों

मुझे अपने नियंत्रकों के साथ अपने मार्गों को छोड़ना और उन्हें एक app/controllersउपनिर्देशिका में व्यवस्थित करना पसंद है । फिर मैं उन्हें लोड कर सकता हूं और उन्हें उन मार्गों को जोड़ने दे सकता हूं जिनकी उन्हें आवश्यकता है।

मेरी app/server.coffeeकॉफ़ीस्क्रिप्ट फ़ाइल में मैं:

[
  'api'
  'authorization'
  'authentication'
  'domains'
  'users'
  'stylesheets'
  'javascripts'
  'tests'
  'sales'
].map (controllerName) ->
  controller = require './controllers/' + controllerName
  controller.setup app

इसलिए मेरे पास फाइलें हैं:

app/controllers/api.coffee
app/controllers/authorization.coffee
app/controllers/authentication.coffee
app/controllers/domains.coffee

और मेरे डोमेन नियंत्रक में उदाहरण के लिए, मेरे पास एक setupफ़ंक्शन है।

exports.setup = (app) ->
  controller = new exports.DomainController
  route = '/domains'
  app.post route, controller.create
  app.put route, api.needId
  app.delete route, api.needId
  route = '/domains/:id'
  app.put route, controller.loadDomain, controller.update
  app.del route, controller.loadDomain, exports.delete
  app.get route, controller.loadDomain, (req, res) ->
    res.sendJSON req.domain, status.OK

दृश्य

विचारों को app/viewsरखना प्रथागत स्थान बन गया है। मैंने उसे ऐसे ही लेटा दिया।

app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade

स्थैतिक फ़ाइलें

एक publicउपनिर्देशिका में जाएं ।

Github / Semver / NPM

Github के लिए अपने git रेपो रूट पर README.md मार्कडाउन फाइल रखें।

NPM के लिए अपने git रेपो रूट में सिमेंटिक वर्जन नंबर के साथ package.json फाइल रखें ।


1
हे पीटर! मैं वास्तव में इस दृष्टिकोण को पसंद कर रहा हूं। मैं एक एक्सप्रेस प्रोजेक्ट पर काम कर रहा हूं और मैं वास्तव में चीजों को सही तरीके से करना चाहता हूं ताकि इसे हैक किया जा सके और इसे आसपास रखा जा सके। शानदार होगा यदि आप github और / या इस पर एक ब्लॉग पोस्ट पर एक नमूना रेपो था।
suVasH .....

4
इस रेपो में पैटर्न का एक गुच्छा है जिसे आप संदर्भ के रूप में उपयोग कर सकते हैं: github.com/focusaurus/peterlyons.com
पीटर लियोंस

75
कॉफी स्क्रिप्ट पढ़ने के लिए यह कठिन है: / वेनिला जेएस को संपादित करने का कोई भी मौका? धन्यवाद
toasted_flakes

1
इस उत्तर के लिए धन्यवाद। मैं बस अपने दिमाग को इसके चारों ओर लपेटने की कोशिश कर रहा हूं। आप अन्य नियंत्रकों को दूसरे के अंदर कैसे पहुँचते हैं (उदाहरण के लिए उपर्युक्त जैसे सेटअप फंक्शन मेंapp.put route, api.needId
chmanie

@PeterLyons: अरे यार, मैंने आपका सोर्स कोड देखा है, लेकिन बिल्ड मोड को कैसे करना है, इसका कोई पता नहीं है, मैं पहले ही इंस्टॉल कर चुका हूं Goऔर binफाइल को स्ट्रक्चर में शामिल कर चुका हूं । आप उस goफ़ाइल को कैसे चलाते हैं bin?
user2002495

51

निम्नलिखित पीटर लियोंस की उत्तर क्रिया है, जो कई अन्य लोगों द्वारा अनुरोध के अनुसार कॉफ़ीसेप्टिक से वेनिला जेएस के लिए रखी गई है। पीटर का जवाब बहुत सक्षम है, और मेरे जवाब पर मतदान करने वाले किसी भी व्यक्ति को अपना वोट देना चाहिए।


कॉन्फ़िग

आप जो कर रहे हैं वह ठीक है। मुझे अपने स्वयं के नेमस्पेस नाम की जगह config.jsएक नेस्टेड नेमस्पेस के साथ एक शीर्ष-स्तरीय फ़ाइल में स्थापित करना है ।

// Set the current environment to true in the env object
var currentEnv = process.env.NODE_ENV || 'development';
exports.appName = "MyApp";
exports.env = {
  production: false,
  staging: false,
  test: false,
  development: false
};  
exports.env[currentEnv] = true;
exports.log = {
  path: __dirname + "/var/log/app_#{currentEnv}.log"
};  
exports.server = {
  port: 9600,
  // In staging and production, listen loopback. nginx listens on the network.
  ip: '127.0.0.1'
};  
if (currentEnv != 'production' && currentEnv != 'staging') {
  exports.enableTests = true;
  // Listen on all IPs in dev/test (for testing from other machines)
  exports.server.ip = '0.0.0.0';
};
exports.db {
  URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"
};

यह sysadmin संपादन के लिए अनुकूल है। तब जब मुझे कुछ चाहिए, जैसे DB कनेक्शन की जानकारी, यह `

require('./config').db.URL

मार्गों / नियंत्रकों

मुझे अपने नियंत्रकों के साथ अपने मार्गों को छोड़ना और उन्हें एक app/controllersउपनिर्देशिका में व्यवस्थित करना पसंद है । फिर मैं उन्हें लोड कर सकता हूं और उन्हें उन मार्गों को जोड़ने दे सकता हूं जिनकी उन्हें आवश्यकता है।

मेरी app/server.jsजावास्क्रिप्ट फ़ाइल में मैं:

[
  'api',
  'authorization',
  'authentication',
  'domains',
  'users',
  'stylesheets',
  'javascripts',
  'tests',
  'sales'
].map(function(controllerName){
  var controller = require('./controllers/' + controllerName);
  controller.setup(app);
});

इसलिए मेरे पास फाइलें हैं:

app/controllers/api.js
app/controllers/authorization.js
app/controllers/authentication.js
app/controllers/domains.js

और मेरे डोमेन नियंत्रक में उदाहरण के लिए, मेरे पास एक setupफ़ंक्शन है।

exports.setup = function(app) {
  var controller = new exports.DomainController();
  var route = '/domains';
  app.post(route, controller.create);
  app.put(route, api.needId);
  app.delete(route, api.needId);
  route = '/domains/:id';
  app.put(route, controller.loadDomain, controller.update);
  app.del(route, controller.loadDomain, function(req, res){
    res.sendJSON(req.domain, status.OK);
  });
}

दृश्य

विचारों को app/viewsरखना प्रथागत स्थान बन गया है। मैंने उसे ऐसे ही लेटा दिया।

app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade

स्थैतिक फ़ाइलें

एक publicउपनिर्देशिका में जाएं ।

Github / Semver / NPM

Github के लिए अपने git रेपो रूट पर README.md मार्कडाउन फाइल रखें।

NPM के लिए अपने git रेपो रूट में सिमेंटिक वर्जन नंबर के साथ package.json फाइल रखें ।


43

मेरा प्रश्न अप्रैल 2011 में पेश किया गया था, यह शांत पुराना है। इस समय के दौरान, मैं Express.js के साथ अपने अनुभव को बेहतर बना सकता हूं और इस पुस्तकालय का उपयोग करके लिखे गए एप्लिकेशन को कैसे आर्किटेक्चर कर सकता हूं। इसलिए, मैं यहां अपना अनुभव साझा करता हूं।

यहाँ मेरी निर्देशिका संरचना है:

├── app.js   // main entry
├── config   // The configuration of my applications (logger, global config, ...)
├── models   // The model data (e.g. Mongoose model)
├── public   // The public directory (client-side code)
├── routes   // The route definitions and implementations
├── services // The standalone services (Database service, Email service, ...)
└── views    // The view rendered by the server to the client (e.g. Jade, EJS, ...)

App.js

app.jsफ़ाइल का लक्ष्य एक्सप्रेस एप्लिकेशन को बूटस्ट्रैप करना है। यह कॉन्फ़िगरेशन मॉड्यूल, लॉगर मॉड्यूल को लोड करता है, डेटाबेस कनेक्शन की प्रतीक्षा करता है, ..., और एक्सप्रेस सर्वर चलाता है।

'use strict';
require('./config');
var database = require('./services/database');
var express = require('express');
var app = express();
module.exports = app;

function main() {
  var http = require('http');

  // Configure the application.
  app.configure(function () {
    // ... ... ...
  });
  app.configure('production', function () {
    // ... ... ...
  });
  app.configure('development', function () {
    // ... ... ...
  });

  var server = http.createServer(app);

  // Load all routes.
  require('./routes')(app);

  // Listen on http port.
  server.listen(3000);
}

database.connect(function (err) {
  if (err) { 
    // ...
  }
  main();
});

मार्गों /

मार्ग निर्देशिका में एक index.jsफ़ाइल है। इसका लक्ष्य routes/निर्देशिका के अंदर अन्य सभी फ़ाइलों को लोड करने के लिए एक प्रकार का जादू शुरू करना है । यहाँ कार्यान्वयन है:

/**
 * This module loads dynamically all routes modules located in the routes/
 * directory.
 */
'use strict';
var fs = require('fs');
var path = require('path');

module.exports = function (app) {
  fs.readdirSync('./routes').forEach(function (file) {
    // Avoid to read this current file.
    if (file === path.basename(__filename)) { return; }

    // Load the route file.
    require('./' + file)(app);
  });
};

उस मॉड्यूल के साथ, एक नया मार्ग परिभाषा बनाना और कार्यान्वयन वास्तव में आसान है। उदाहरण के लिए hello.js:

function hello(req, res) {
  res.send('Hello world');
}

module.exports = function (app) {
  app.get('/api/hello_world', hello);
};

प्रत्येक रूट मॉड्यूल स्टैंडअलोन है


क्या आप इस संरचना को बनाने के लिए एक जनरेटर का उपयोग करते हैं?
आशीष

18

मैं एक समारोह आदि के बजाय एक वैश्विक "ऐप" का उपयोग करना पसंद करता हूं


मैं रचनाकारों से सलाह लेने का विकल्प चुनता हूं :) बीटीडब्ल्यू, क्या आप हमें कुछ कोड प्रदान कर सकते हैं?
अवतार

ये सही है। इस ऐप में आप देखें - github.com/visionmedia/screenshot-app
diproart

17

मुझे लगता है कि यह एक शानदार तरीका है। एक्सप्रेस तक ही सीमित नहीं है, लेकिन मैंने एक ही काम कर रहे github पर नोड के कई प्रोजेक्ट देखे हैं। वे विन्यास पैरामीटर + छोटे मॉड्यूल निकालते हैं (कुछ मामलों में प्रत्येक यूआरआई) अलग-अलग फाइलों में फैक्टर होते हैं।

मैं एक विचार प्राप्त करने के लिए जीथब पर एक्सप्रेस-विशिष्ट परियोजनाओं के माध्यम से जाने की सलाह दूंगा। IMO जिस तरह से आप कर रहे हैं वह सही है।


16

यह अब 2015 का अंत है और 3 साल के लिए और छोटे और बड़े प्रोजेक्ट में मेरी संरचना विकसित करने के बाद। निष्कर्ष?

एक बड़े MVC को न करें, लेकिन इसे मॉड्यूल में अलग करें

इसलिए...

क्यों?

  • आमतौर पर एक एक मॉड्यूल (जैसे उत्पाद) पर काम करता है, जिसे आप स्वतंत्र रूप से बदल सकते हैं।

  • आप मॉड्यूल का पुन: उपयोग करने में सक्षम हैं

  • आप इसे अलग तरीके से परखने में सक्षम हैं

  • आप इसे अलग से बदलने में सक्षम हैं

  • उनके पास स्पष्ट (स्थिर) इंटरफेस है

    -अति नवीनतम, अगर वहाँ कई डेवलपर्स काम कर रहे थे, मॉड्यूल जुदाई में मदद करता है

Nodebootstrap परियोजना अपने अंतिम संरचना करने के लिए एक समान दृष्टिकोण है। ( गीथूब )

यह संरचना कैसी दिखती है?

  1. अलग-अलग MVC के साथ छोटे, कैपसूल मॉड्यूल

  2. प्रत्येक मॉड्यूल में एक पैकेज है

  3. संरचना के एक भाग के रूप में परीक्षण (प्रत्येक मॉड्यूल में)

  4. वैश्विक विन्यास , पुस्तकालय और सेवाएँ

  5. एकीकृत डोकर, क्लस्टर, हमेशा के लिए

Folderoverview (मॉड्यूल के लिए lib फ़ोल्डर देखें):

नोडबूटस्ट्रैप संरचना


3
यह उपयोगी होगा यदि आप अलग-अलग मॉड्यूल के साथ फ़ोल्डर अवलोकन तस्वीर को अपडेट कर सकते हैं, साथ ही साथ आप उन्हें कैसे संरचना करेंगे, इसका एक उदाहरण।
यंगग्र्र्र

8

मैं MVC शैली फ़ोल्डर संरचना दे रहा हूँ कृपया बलो को खोजें।

हमने अपने बड़े और मध्यम वेब अनुप्रयोगों के लिए bellow फ़ोल्डर संरचना का उपयोग किया।

 myapp   
|
|
|____app
|      |____controllers
|      |    |____home.js
|      |
|      |____models
|      |     |___home.js
|      |
|      |____views
|           |___404.ejs
|           |___error.ejs
|           |___index.ejs
|           |___login.ejs
|           |___signup.ejs
|   
|
|_____config
|     |___auth.js
|     |___constants.js
|     |___database.js
|     |___passport.js
|     |___routes.js
|
|
|____lib
|    |___email.js
|
|____node_modules
|
|
|____public.js
|    |____css
|    |    |__style.css
|    |    
|    |____js
|    |    |__script.js
|    |
|    |____img
|    |    |__img.jpg
|    |
|    |
|    |____uploads
|         |__img.jpg
|      
|   
|
|_____app.js
|
|
|
|_____package.json

मैंने एक npm मॉड्यूल जेनरेशन एक्सप्रेस mvc फ़ोल्डर स्ट्रक्चरर के लिए बनाया है।

कृपया bellow https://www.npmjs.com/package/express-mvc-generator खोजें

इस मॉड्यूल को उत्पन्न करने और उपयोग करने के लिए बस सरल कदम।

i) मॉड्यूल स्थापित करें npm install express-mvc-generator -g

ii) विकल्पों की जाँच करें express -h

iii) एक्सप्रेस पीवीसी संरचना उत्पन्न करें express myapp

iv) निर्भरताएँ स्थापित करें npm install:

v) अपना config / database.js खोलें, कृपया अपने mongo db को कॉन्फ़िगर करें।

vi) एप्लिकेशन को चलाएं node appयाnodemon app

vii) URL http चेक करें : // localhost: 8042 / साइनअप या http: // yourip: 8042 / साइनअप


7

इस प्रश्न के अंतिम उत्तर के बाद से काफी समय हो गया है और एक्सप्रेस ने हाल ही में संस्करण 4 भी जारी किया है, जिसने इस ऐप संरचना को व्यवस्थित करने के लिए कुछ उपयोगी चीजें जोड़ी हैं।

नीचे अपने एक्सप्रेस ऐप को कैसे तैयार किया जाए, इसके बारे में सर्वोत्तम अभ्यास के बारे में ब्लॉग पोस्ट को लंबे समय तक देखा जा सकता है। http://www.terlici.com/2014/08/25/best-practices-express-structure.html

लेख में सलाह को लागू करने वाला एक GitHub भंडार भी है। यह हमेशा नवीनतम एक्सप्रेस संस्करण के साथ अद्यतित रहता है।
https://github.com/terlici/base-express


7

मुझे नहीं लगता कि यह कॉन्फ़िगर करने के लिए मार्गों को जोड़ने के लिए एक अच्छा तरीका है। एक बेहतर संरचना कुछ इस तरह हो सकती है:

application/
| - app.js
| - config.js
| - public/ (assets - js, css, images)
| - views/ (all your views files)
| - libraries/ (you can also call it modules/ or routes/)
    | - users.js
    | - products.js
    | - etc...

तो products.js और users.js आपके सभी मार्गों को समाहित करेंगे सभी तर्क भीतर होंगे।


6

वैसे मैंने अपने मार्गों को एक json फ़ाइल के रूप में रखा है, जिसे मैंने शुरुआत में पढ़ा था, और app.js में फॉर-लूप में मार्गों को सेट किया था। मार्ग.जसन में वह दृश्य शामिल है जिसे कहा जाना चाहिए, और मार्ग में भेजे जाने वाले मूल्यों के लिए कुंजी।
यह कई सरल मामलों के लिए काम करता है, लेकिन मुझे विशेष मामलों के लिए कुछ मार्गों को मैन्युअल रूप से बनाना पड़ा।


6

मैंने इस मामले के बारे में एक पोस्ट लिखी है। यह मूल रूप से अपने फ़ंक्शन को कॉल routeRegistrarकरने वाले फ़ोल्डर में फ़ाइलों के माध्यम से पुनरावृति /controllersकरता है init। फ़ंक्शन initएक्सप्रेस appचर को एक पैरामीटर के रूप में लेता है ताकि आप अपने मार्गों को अपने इच्छित तरीके से पंजीकृत कर सकें।

var fs = require("fs");
var express = require("express");
var app = express();

var controllersFolderPath = __dirname + "/controllers/";
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
    if(controllerName.indexOf("Controller.js") !== -1){
        var controller = require(controllersFolderPath + controllerName);
        controller.init(app);
    }
});

app.listen(3000);

5

यह ब्याज की हो सकती है:

https://github.com/flatiron/nconf

फाइल, पर्यावरण चर, कमांड लाइन तर्क और परमाणु वस्तु विलय के साथ पदानुक्रमित नोड.जेएस विन्यास।


4

1) आपकी एक्सप्रेस परियोजना फ़ाइल सिस्टम शायद:

/ ...
/lib
/node_modules
/public
/views
      app.js
      config.json
      package.json

app.js - आप वैश्विक ऐप कंटेनर

2) मॉड्यूल मुख्य फ़ाइल (lib / mymodule / index.js):

var express = require('express');    
var app = module.exports = express();
// and load module dependencies ...  

// this place to set module settings
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

// then do module staff    
app.get('/mymodule/route/',function(req,res){ res.send('module works!') });

3) मुख्य app.js में कनेक्ट मॉड्यूल

...
var mymodule = require('mymodule');
app.use(mymodule);

4) नमूना तर्क

lib/login
lib/db
lib/config
lib/users
lib/verify
lib/
   /api/ 
   ...
lib/
   /admin/
      /users/
      /settings/
      /groups/
...
  • परीक्षण के लिए सर्वश्रेष्ठ
  • पैमाने के लिए सबसे अच्छा है
  • अलग मॉड्यूल द्वारा निर्भर करता है
  • कार्यक्षमता (या मॉड्यूल) द्वारा समूहीकरण मार्ग

tj कहते हैं / Vimeo पर विचार दिलचस्प विचार है कि एक्सप्रेस एप्लिकेशन को कैसे संशोधित करता है - Node.js और एक्सप्रेस के साथ मॉड्यूलर वेब एप्लिकेशन । शक्तिशाली और सरल।


4

http://locomotivejs.org/ Node.js और Express के साथ निर्मित ऐप को संरचना करने का एक तरीका प्रदान करता है।

वेबसाइट से:

"लोकोमोटिव Node.js. के लिए एक वेब फ्रेमवर्क है। लोकोमोटिव किसी भी डेटाबेस और टेम्पलेट इंजन के साथ मूल रूप से एकीकृत करते हुए, एमवीसी पैटर्न, रेस्टफुल मार्गों और कन्वेंशन का समर्थन करता है। लोकोमोटिव एक्सप्रेस पर बनाता है, जिससे आप जिस शक्ति और सादगी की उम्मीद करते हैं, उसका संरक्षण होता है। नोड से। "


3

मैंने हाल ही में स्वतंत्र मिनी-एप्स के रूप में मॉड्यूल को अपनाया।

|-- src
  |--module1
  |--module2
     |--www
       |--img
       |--js
       |--css
     |--#.js
     |--index.ejs
  |--module3
  |--www
     |--bower_components
     |--img
     |--js
     |--css
  |--#.js
  |--header.ejs
  |--index.ejs
  |--footer.ejs

अब किसी भी मॉड्यूल रूटिंग (# .js) के लिए, दृश्य (* .jj), js, css और संपत्ति एक-दूसरे के बगल में हैं। submodule रूटिंग को पैरेंट # .js में दो अतिरिक्त लाइनों के साथ सेट किया जाता है

router.use('/module2', opt_middleware_check, require('./module2/#'));
router.use(express.static(path.join(__dirname, 'www')));

इस तरह से भी सबमबमॉड्यूल संभव है।

Src डायरेक्टरी में व्यू सेट करना न भूलें

app.set('views', path.join(__dirname, 'src'));

मार्ग, दृश्य और मॉडल देखने में रुचि रखने वाले इस तरह के ढांचे के साथ गितुब का कोई लिंक लोड किया जा रहा है
मुहम्मद उमर

मुझे लगता है कि सब कुछ समझाया गया है। रूट सिर्फ क्लासिक एक्सप्रेस रूट हैं। मॉड्यूल के नामों के साथ उपसर्गों को लोड करने की आवश्यकता होती है, मॉडल को सापेक्ष पथ को संदर्भित करके लोड करने की आवश्यकता होती है।
zevero

अपनी अंतिम पंक्ति पर, मैंने src निर्देशिका में दृश्य सेट किया। तो यहाँ से, सभी दृश्य src निर्देशिका के सापेक्ष सुलभ हैं। कुछ भी आकर्षक नहीं।
8

1

यह है कि मेरे एक्सप्रेस प्रोजेक्ट की अधिकांश संरचना कैसी दिखती है।

मैं आमतौर पर express dirnameप्रोजेक्ट को इनिशियलाइज़ करने के लिए करता हूं, मेरे आलस्य को माफ करता हूं, लेकिन यह बहुत लचीला और विस्तार योग्य है। पुनश्च - आपको इसके लिए प्राप्त करने की आवश्यकता express-generatorहै (जो लोग इसे खोज रहे हैं sudo npm install -g express-generator, सुडो क्योंकि आप इसे विश्व स्तर पर स्थापित कर रहे हैं)

|-- bin
    |-- www //what we start with "forever"
|-- bower_components
|-- models
    |-- database.js
    |-- model1.js //not this exact name ofcourse.
    |-- .
|-- node_modules
|-- public
    |-- images
    |-- javascripts
        |-- controllers
        |-- directives
        |-- services
        |-- app.js
        |-- init.js //contains config and used for initializing everything, I work with angular a lot.
    |-- stylesheets
|-- routes
    |-- some
    |-- hierarchy
    .
    .
|-- views
    |-- partials
    |-- content
|-- .env
|-- .env.template
|-- app.js
|-- README.md

आप सोच रहे होंगे ।env फाइलें क्यों? क्योंकि वे काम करते हैं! मैं dotenvअपनी परियोजनाओं में मॉड्यूल का उपयोग करता हूं (बहुत हाल ही में) और यह काम करता है! में app.jsया इन 2 बयानों में पॉपwww

var dotenv = require('dotenv');
dotenv.config({path: path.join(__dirname + "/.env")});

और /bower_componentsसंसाधन के तहत स्थैतिक सामग्री की सेवा के लिए एक और लाइन जल्दी से सेट करें/ext

app.use('/ext', express.static(path.join(__dirname, 'bower_components')));

यह शायद उन लोगों के लिए एक फिट हो सकता है जो एक्सप्रेस और कोणीय का एक साथ उपयोग करना चाहते हैं, या बस उस javascriptsपदानुक्रम के बिना व्यक्त करते हैं।


1

मेरी संरचना एक्सप्रेस 4. https://github.com/odirleiborgert/borgert-express-boilerplate

संकुल

View engine: twig
Security: helmet
Flash: express-flash
Session: express-session
Encrypt: bcryptjs
Modules: express-load
Database: MongoDB
    ORM: Mongoose
    Mongoose Paginate
    Mongoose Validator
Logs: winston + winston-daily-rotate-file
Nodemon
CSS: stylus
Eslint + Husky

संरचना

|-- app
    |-- controllers
    |-- helpers
    |-- middlewares
    |-- models
    |-- routes
    |-- services
|-- bin
|-- logs
|-- node_modules
|-- public
    |-- components
    |-- images
    |-- javascripts
    |-- stylesheets
|-- views
|-- .env
|-- .env-example
|-- app.js
|-- README.md

0

उर एक्सप्रेस एप्लिकेशन को संरचना करने का एक सरल तरीका:

  • मुख्य index.js में निम्नलिखित आदेश बनाए रखा जाना चाहिए।

    सभी app.set पहले होना चाहिए।

    सभी app.use दूसरे होना चाहिए।

    अपने कार्यों या अन्य फ़ाइलों में मार्ग-जारी रखने के साथ अन्य एपिस द्वारा पीछा किया

    exapmle

    app.use ("/ पासवर्ड", पासवर्डएपीआई);

    app.use ("/ user", userApi);

    app.post ("/ token", passport.createToken);

    app.post ("/ लॉगआउट", पासपोर्ट.लॉगआउट)


0

एक्सप्रेसजेएस प्रोजेक्ट के लिए एमवीसी संरचना के लिए सबसे अच्छा तरीका है हैंडलबार और पासपोर्टपोर्ट्स के साथ

- app
      -config 
        -passport-setup.js
      -controllers
      -middleware
      -models
      -routes
      -service
    -bin
      -www
      -configuration.js
      -passport.js
    -node_modules
    -views
     -handlebars page
    -env
    -.gitignore
    -package.json
    -package-lock.json

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.