एक्सप्रेस.जेएस एप्लिकेशन की संरचना कैसे करें?


102

क्या Express.js अनुप्रयोग app.jsमें फ़ाइल को तोड़ने और संशोधित करने के लिए एक आम सम्मेलन है ? या सब कुछ एक ही फाइल में रखना आम है?


3
वहाँ लोग उन्हें मार्गों में तोड़ रहे हैं। इसके अलावा, आप एक्सप्रेस-संसाधनों पर एक नज़र डाल सकते हैं।
ब्रम्हप्रसाद

@Brandon_R क्या आपने संसाधनों की कोशिश की है? मैंने इसे देखा और सोचा कि यह साफ दिख रहा है, बस अभी तक टायर को लात नहीं मारी है।
मौका

1
थोड़ी देर हो गई, लेकिन मैंने हाल ही में एक्सप्रेस के लिए एक राउटर को खोला, जो आपको ऐप को तोड़ने की अनुमति देता है। अच्छी तरह से इंट्रो कंट्रोलर + दृश्य आदि देखें: github.com/kishorenc/road
jeffreyveon

जवाबों:


82

मेरे पास मेरा टूटना इस प्रकार है:

~/app
|~controllers
| |-monkey.js
| |-zoo.js
|~models
| |-monkey.js
| |-zoo.js
|~views
| |~zoos
|   |-new.jade
|   |-_form.jade
|~test
|  |~controllers
|    |-zoo.js
|  |~models
|    |-zoo.js
|-index.js

मैं क्या प्रासंगिक है लौटने के लिए एक्सपोर्ट्स का उपयोग करता हूं। उदाहरण के लिए, मेरे द्वारा किए गए मॉडल में:

module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema);

और फिर अगर मुझे फोन नंबर बनाने की आवश्यकता है, तो यह उतना ही सरल है:

var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();

अगर मुझे स्कीमा का उपयोग करने की आवश्यकता है, तो PhoneNumber.schema

(जो मानता है कि हम रूट फ़ोल्डर से काम कर रहे हैं और 1 स्तर ऊपर और फिर नीचे मॉडल पर जाने की आवश्यकता है)


EDIT 4

एक्सप्रेस विकी इसके शीर्ष पर बनाया गया चौखटे की एक सूची है।

उनमें से, मुझे लगता है कि ट्विटर का मैटाडोर बहुत अच्छी तरह से संरचित है। हमने वास्तव में बहुत ही समान दृष्टिकोण का उपयोग किया कि वे कैसे ऐप के कुछ हिस्सों को लोड करते हैं।

derby.js भी बेहद दिलचस्प लग रहा है। यहसभी प्रचार के बिना उल्का के समान हैऔर वास्तव में क्रेडिट देता है जहां क्रेडिट देय है (विशेषकर, नोड और एक्सप्रेस)।


EDIT 3

यदि आप CoffeeScript (I am not) के प्रशंसक हैं और Reeaeaaaaaally रेल्स का L & F चाहते हैं, तो टॉवर.जेएस भी है ।


EDIT 2

यदि आप रेल से परिचित हैं और लोकोमोटिव है तो कुछ अवधारणाओं के ब्लीड-ओवर का बुरा मत मानना । यह एक्सप्रेस-वे पर बनाया गया एक हल्के वजन का ढांचा है। यह RoR के समान एक समान संरचना है और कुछ अधिक अल्पविकसित अवधारणाओं (जैसे रूटिंग) पर कार्य करता है।

यहां तक ​​कि अगर आप इसे इस्तेमाल करने की योजना नहीं बनाते हैं तो भी यह जांचने लायक है।


EDIT 1

नोडज्स-एक्सप्रेस-मेनगोज़-डेमो बहुत ही समान है कि मैंने अपनी संरचना कैसे की है। इसकी जांच - पड़ताल करें।


2
व्यावसायिक तर्क कहाँ जाता है? क्या आप कभी प्रमाणीकरण जैसी चीजों के लिए सहायकों का उपयोग करते हैं?
एरिक द रेड

@EridheRed अगर आप MVC पैटर्न (रेल, Asp.Net mvc, आदि) से परिचित हैं, तो मैं अपने रूट को अपना नियंत्रक मानता हूं और उसके बाद हर तरह की गिरावट आती है। व्यापार तर्क मॉडल में जाता है (हालांकि मुझे सत्यापन और मानस के साथ कठिनाइयों का सामना करना पड़ रहा है)। सहायकों के लिए, मैं एक साधारण आंतरिक उपयोग पुस्तकालय पर निर्यात का उपयोग करता हूं जो मैं अपने लिए उन चीजों के लिए एक साथ रख रहा हूं जिन्हें मैं पुन: उपयोग करता हूं।
मौका

यह देखने के लिए हमारे लिए एक नमूना सेटअप अपलोड करने के लिए बढ़िया होगा। रूट्स फोल्डर / फाइलों में क्या जाता है?
23

1
@chovy मैंने github.com/qed42/nodejs-express-mongoose-demo में एक लिंक जोड़ा है जिसकी संरचना बहुत ही समान है
संभावना

मैं एक्सप्रेस के शीर्ष पर निर्मित किसी भी
मिश्रित

9

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

बंटवारे के बारे में अधिक विशिष्ट होने के लिए app.jsमेरे पास निम्नलिखित app.js फ़ाइल है

var express = require('express'),
    bootstrap = require('./init/bootstrap.js'),
    app = module.exports = express.createServer();

bootstrap(app);

मूल रूप से इसका मतलब है कि मैं अपने सभी बूटस्ट्रैपिंग को एक अलग फाइल में रखता हूं, फिर मैं सर्वर को बूटस्ट्रैप करता हूं।

तो बूटस्ट्रैप क्या करता है?

var configure = require("./app-configure.js"),
    less = require("./watch-less.js"),
    everyauth = require("./config-everyauth.js"),
    routes = require("./start-routes.js"),
    tools = require("buffertools"),
    nko = require("nko"),
    sessionStore = new (require("express").session.MemoryStore)()

module.exports = function(app) {
    everyauth(app);
    configure(app, sessionStore);
    less();
    routes(app, sessionStore);
    nko('/9Ehs3Dwu0bSByCS');


    app.listen(process.env.PORT);
    console.log("server listening on port xxxx");
};

अच्छी तरह से यह सभी सर्वर इनिशियलाइज़ेशन सेटअप को अच्छी मात्रा में विभाजित करता है। विशेष रूप से

  • मेरे पास एक चंक है जो हर ऑथेंट का उपयोग करके मेरे सभी रिमोट OAuth प्रमाणीकरण को स्थापित करता है।
  • मेरे पास एक चंक है जो मेरे एप्लिकेशन को कॉन्फ़िगर करता है (मूल रूप से कॉलिंग app.configure)
  • मेरे पास थोड़ा सा कोड है जो कम घूंसा मारता है इसलिए यह मेरे किसी भी कम को रन टाइम में css में पुन: संकलित करता है।
  • मेरे पास कोड है जो मेरे सभी मार्गों को सेट करता है
  • मैं इस छोटे nko मॉड्यूल कहते हैं
  • अंत में मैं एक पोर्ट सुनकर सर्वर शुरू करता हूं।

बस उदाहरण के लिए, रूटिंग फ़ाइल को देखें

var fs = require("fs"),
    parseCookie = require('connect').utils.parseCookie;

module.exports = function(app, sessionStore) {
    var modelUrl = __dirname + "/../model/",
        models = fs.readdirSync(modelUrl),
        routeUrl = __dirname + "/../route/"
        routes = fs.readdirSync(routeUrl);

यहां मैं अपने सभी मॉडल और मार्गों को फाइलों की सरणियों के रूप में लोड करता हूं।

डिस्क्लेमर: readdirSync केवल तभी ठीक होता है जब आपको http सर्वर (पहले .listen) शुरू करने से पहले कॉल किया जाता है । सर्वर स्टार्ट टाइम पर सिंक्रोनस ब्लॉकिंग कॉल को कॉल करना कोड को और अधिक पठनीय बनाता है (यह मूल रूप से हैक है)

    var io = require("socket.io").listen(app);

    io.set("authorization", function(data, accept) {
        if (data.headers.cookie) {
            data.cookie = parseCookie(data.headers.cookie);

            data.sessionId = data.cookie['express.sid'];

            sessionStore.get(data.sessionId, function(err, session) {

                if (err) {
                    return accept(err.message, false);
                } else if (!(session && session.auth)) {
                    return accept("not authorized", false)
                }
                data.session = session;
                accept(null, true);
            });
        } else {
            return accept('No cookie', false);
        }
    });

यहाँ मैं socket.io को वास्तव में प्राधिकरण का उपयोग करने के लिए पंच करता हूं, फिर किसी भी टॉम और जैक को अपने सॉकेट.io सर्वर से बात करने देता हूं

    routes.forEach(function(file) {
        var route = require(routeUrl + file),
            model = require(modelUrl + file);

        route(app, model, io);
    });
};

यहां मैं संबंधित मॉडल को रूट फ़ाइल से लौटाए गए प्रत्येक रूट ऑब्जेक्ट में पास करके अपने रूट शुरू करता हूं।

मूल रूप से जिस्ट आप सब कुछ अच्छा छोटे मॉड्यूल में व्यवस्थित करते हैं और फिर कुछ बूटस्ट्रैपिंग तंत्र है।

मेरे अन्य प्रोजेक्ट (मेरे ब्लॉग) में एक समान संरचना वाला एक इनिट फ़ाइल है

अस्वीकरण: ब्लॉग टूट गया है और निर्माण नहीं करता है, मैं इस पर काम कर रहा हूं।


1

बनाए रखने योग्य रूटिंग संगठन के लिए आप एक्सप्रेस-रूटस्कैन नोड मॉड्यूल के बारे में इस लेख की जांच कर सकते हैं और इसे आज़मा सकते हैं। यह मेरे लिए सबसे अच्छा समाधान है।


0

मेरे पास एक्सप्रेस-जनरेटर टूल के शीर्ष पर मेरे ऐप्स हैं। आप इसे चलाकर स्थापित कर सकते हैं npm install express-generator -gऔर इसका उपयोग करके चला सकते हैं express <APP_NAME>

आपको एक परिप्रेक्ष्य देने के लिए, मेरे छोटे अनुप्रयोग की संरचना में से एक इस तरह दिखी:

~/
|~bin
| |-www
|
|~config
| |-config.json
|
|~database
| |-database.js
|
|~middlewares
| |-authentication.js
| |-logger.js
|
|~models
| |-Bank.js
| |-User.js
|
|~routes
| |-index.js
| |-banks.js
| |-users.js
|
|~utilities
| |-fiat-converersion.js
|
|-app.js
|-package.json
|-package-lock.json

इस संरचना के बारे में एक अच्छी बात यह है कि मैं अपने द्वारा विकसित किए गए किसी भी एक्सप्रेस एप्लिकेशन को अपनाता हूं, जिस तरह से मार्गों को व्यवस्थित किया जाता है। मैं app.js और app.use()प्रत्येक मार्ग में प्रत्येक मार्ग फ़ाइलों की आवश्यकता होने के लिए पसंद नहीं था , खासकर के रूप में फ़ाइल बड़ा हो जाता है। जैसे, मैंने इसे अपने app.use()./routes/index.js फ़ाइल पर समूह और सभी को केंद्रीकृत करने में मददगार पाया ।

अंत में, मेरा app.js कुछ इस तरह दिखेगा:

...
const express = require('express');
const app = express();

...
require('./routes/index')(app);

और मेरे ./routes/index.js कुछ इस तरह दिखेंगे:

module.exports = (app) => {
  app.use('/users', require('./users'));
  app.use('/banks', require('./banks'));
};

मैं केवल require(./users)इसलिए सक्षम हूं क्योंकि मैंने एक्सप्रेस का उपयोग करके उपयोगकर्ताओं के मार्ग को लिखा था। राउटर () जो मुझे कई समूहों को "समूह" करने की अनुमति देता है और फिर उन्हें एक ही बार में निर्यात करता है, एप्लिकेशन को अधिक मॉड्यूलर बनाने के लक्ष्य के साथ।

यह इस बात का एक उदाहरण है कि आप मेरे / .आउटर्स / यूसर्स मार्ग पर क्या ठीक करेंगे:


const router = require('express').Router();

router.post('/signup', async (req, res) => {
    // Signup code here
});

module.exports = router;

उम्मीद है कि यह आपके प्रश्न का उत्तर देने में मदद करेगा! शुभकामनाएँ!

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