एक्सप्रेस। रूटर और app.get के बीच अंतर?


265

मैं NodeJS और एक्सप्रेस 4 से शुरू कर रहा हूं, और मैं थोड़ा भ्रमित हूं। मैं एक्सप्रेस की वेबसाइट पढ़ रहा है, लेकिन नहीं देख सकते हैं जब एक मार्ग हैंडलर या जब उपयोग करने के लिए उपयोग करने के लिए express.Router

जैसा कि मैं देख सकता था, अगर मैं एक पृष्ठ या कुछ दिखाना चाहता हूं जब उपयोगकर्ता /showउदाहरण के लिए हिट करता है तो मुझे इसका उपयोग करना चाहिए:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

शुरुआत में, मुझे लगा कि यह पुराना है (एक्सप्रेस 3 के लिए)। क्या यह सही है या यह एक्सप्रेस 4 के लिए भी रास्ता है?

यदि यह एक्सप्रेस 4 में ऐसा करने का तरीका है, तो इसका express.Routerउपयोग किस लिए किया जाता है?

मैं ऊपर के रूप में लगभग एक ही उदाहरण पढ़ा, लेकिन का उपयोग कर express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

तो, दोनों उदाहरणों में क्या अंतर है?

यदि मैं एक साधारण परीक्षण वेबसाइट करना चाहता हूं तो मुझे किसका उपयोग करना चाहिए?


27
A अपने स्वयं के अनुरोधों के लिए Routerनहीं है .listen()। यह आपके एप्लिकेशन को कई मॉड्यूलों में अलग करने के लिए उपयोगी है - Routerप्रत्येक में ऐसा कर appसकते हैं जो कर सकते हैं require()और .use()मिडलवेयर के रूप में।
जोनाथन लोनोव्स्की

5
@JonathanLonowski पर संकेत के रूप में, app.get(..)वाक्यविन्यास express.routerअधिक सुविधाजनक के साथ काम करने के लिए एक शॉर्टकट है । यदि आप अभी शुरू कर रहे हैं, तो राउटर की बारीकियों के बारे में चिंता न करें।
आत्माप्रवेद्र

1
तो आप कह रहे हैं कि मुझे केवल app.get () के लिए उपयोग करना चाहिए? अभी भी उलझन में है कि एक या दूसरे का उपयोग कब करें
nelson687

11
@ nelson687 वास्तव में उनके बीच एक कठोर नियम नहीं है। यदि आप app'sस्वयं की रूटिंग विधियों को महसूस करते हैं, जैसे कि app.get(), आपकी आवश्यकताओं के लिए पर्याप्त हैं, तो उनका उपयोग करें। Routerसिर्फ वहाँ सुविधा आप एक से अधिक मॉड्यूल भर में आवेदन व्यवस्थित करने में मदद करने के लिए है। गाइड से : " वर्ग मॉड्यूलर mountable मार्ग संचालकों बनाने के लिए इस्तेमाल किया जा सकता है एक। उदाहरण के लिए एक पूर्ण मिडलवेयर और मार्ग प्रणाली है; इस कारण के लिए यह अक्सर एक के रूप में जाना जाता है" मिनी एप्लिकेशन "। "express.RouterRouter
जोनाथन Lonowski

जवाबों:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

जब var app = express()कहा जाता है, तो एक ऐप ऑब्जेक्ट वापस आ जाता है। इसे मुख्य ऐप समझें

जब var router = express.Router()कॉल किया जाता है, तो थोड़ा अलग मिनी ऐप लौटाया जाता है। मिनी ऐप के पीछे का विचार यह है कि आपके ऐप का प्रत्येक मार्ग काफी जटिल हो सकता है, और आपको उस कोड को एक अलग फ़ाइल में ले जाने से लाभ होगा। प्रत्येक फ़ाइल का राउटर एक मिनी ऐप बन जाता है , जिसमें मुख्य ऐप के समान संरचना होती है ।

ऊपर दिए गए उदाहरण में, / कुत्तों के मार्ग के लिए कोड को अपनी फ़ाइल में ले जाया गया है ताकि यह मुख्य ऐप को बंद न करे/ बिल्लियों और पक्षियों के लिए कोड उनकी अपनी फ़ाइलों में समान रूप से संरचित होंगे। इस कोड को तीन मिनी ऐप्स में अलग करके , आप अलगाव में हर एक के लिए तर्क पर काम कर सकते हैं, और इस बात की चिंता न करें कि यह अन्य दो को कैसे प्रभावित करेगा।

यदि आपके पास कोड (मिडलवेयर) है जो तीनों मार्गों से संबंधित है, तो आप कॉल से पहले इसे मुख्य ऐप में डाल सकते app.use(...)हैं। यदि आपके पास कोड (मिडलवेयर) है जो उन मार्गों में से केवल एक से संबंधित है, तो आप इसे केवल उस मार्ग के लिए फ़ाइल में रख सकते हैं।


app.use('/dogs', dogs)(app)जब से आप मार्गों को परिभाषित कर रहे हैं, तब तक आपको ऐप ऑब्जेक्ट को पास नहीं करना चाहिए , इसके अलावा (और मुझे सही करें अगर मैं गलत हूं) यदि आप इसे इस तरह करते हैं तो ऐप ऑब्जेक्ट में पहले से उस पर रखे गए सभी मध्य-वेयर हैं और अतिरिक्त मध्य-बर्तन को ऐप ऑब्जेक्ट में जोड़ दिया जाएगा (कुत्तों के मार्ग में अधिक मध्य-बर्तन मान लिया गया है)। यदि आप इसका उपयोग करते हैं, route.get('/dogs', route)तो उस राउटर में परिभाषित मार्गों के साथ इंटरैक्ट करते समय केवल ऐप-ऑब्जेक्ट को मध्य-वेयर पास करता है और यदि ऐप का दायरा मार्ग के बाहर है, तो उस मध्य-वेयर तक पहुंच नहीं है।
रेवेनस

1
आपको ऐप को रूट करने की आवश्यकता नहीं है, क्योंकि रूट को ऐप के साथ पास किया जा रहा है app.use('/dogs', show)। इस तरह से मार्ग ऐप से स्वतंत्र है, और किसी भी एक्सप्रेस ऐप में इसका पुन: उपयोग किया जा सकता है। किसी मार्ग द्वारा उस मार्ग का उपयोग करने से पहले कहीं भी रखा गया मिडिलवेयर। यदि आप app.js में सभी मार्गों के ऊपर मिडलवेयर रखते हैं, तो सभी रूट उस मिडलवेयर का उपयोग करेंगे। यदि आप किसी रूट फ़ाइल (dogs.js) के अंदर मिडलवेयर रखते हैं, तो केवल वह रूट ही इसका उपयोग करेगा। यदि आप dogs.js के अंदर GET मार्ग के बाद मिडलवेयर रखते हैं, तो केवल POST मार्ग इसका उपयोग करेगा (जब तक कि यह एक प्रतिक्रिया के साथ समाप्त होता है)।
नोक्टर्नो

आह मेरी बुर मेरा मतलब था app.get('/dogs'dogs,)(app)क्योंकि सवाल app.get और path.get की सुविधा के बारे में था। आप दिखा रहे थे कि उन्हें प्रबंधित करने के लिए मार्गों को कैसे अलग किया जाए। लेकिन अगर हम बात कर रहे हैं तो मेरा एनाकोट सही नहीं होगा app.get? अगर मैं एक पीसी पर प्राप्त कर सकता हूं तो मैं अपनी उपरोक्त टिप्पणी संपादित करूंगा।
रेवेनस

2
मेरा ऐप तब भी काम करता है जब मैं या तो एक्सप्रेस का उपयोग करता हूं। राउटर () या एक्सप्रेस (), मैं अंतर को समझ नहीं सका :(
अजय सुवालका

3
@ अजय सुवालका मुझे नहीं पता कि मैंने जो पहले ही कहा है, उस पर मैं और कैसे विस्तार कर सकता हूं। डॉक्स कहते हैं "एक राउटर ऑब्जेक्ट मिडलवेयर और मार्गों का एक अलग उदाहरण है"। मुझे @Jonathan Lonowski की टिप्पणी भी पसंद है, "A अपने स्वयं के अनुरोधों के लिए Routerनहीं है .listen()"। यह मुख्य अंतर हो सकता है।
निशाचरो

29

एक्सप्रेस 4.0 नए राउटर के साथ आता है। साइट पर बताया गया है:

एक्सप्रेस। राउटर क्लास का उपयोग मॉड्यूलर माउंटेबल रूट हैंडलर बनाने के लिए किया जा सकता है। एक राउटर उदाहरण एक पूर्ण मिडलवेयर और रूटिंग सिस्टम है; इस कारण से इसे अक्सर "मिनी-ऐप" कहा जाता है।

Https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 पर एक अच्छा लेख है जो मतभेदों का वर्णन करता है और राउटर्स के साथ क्या किया जा सकता है।

संक्षेप में

राउटर के साथ आप अपने कोड को अधिक आसानी से संशोधित कर सकते हैं। आप रूटर्स का उपयोग कर सकते हैं:

  1. बेसिक रूट्स: होम, अबाउट
  2. कंसोल के लिए अनुरोध लॉग करने के लिए मिडिलवेयर रूट करें
  3. पैरामीटर्स के साथ रूट
  4. विशिष्ट मापदंडों को मान्य करने के लिए पैरामीटर्स के लिए मिडिलवेयर को रूट करें
  5. एक निश्चित मार्ग के लिए पारित एक पैरामीटर को मान्य करता है

ध्यान दें:

app.routerवस्तु है, जो एक्सप्रेस 4 में हटा दिया गया था, नए संस्करण में एक्सप्रेस 5. में वापसी की है, यह एक बस आधार एक्सप्रेस रूटर लिए एक संदर्भ है एक्सप्रेस 3, जब किसी ऐप स्पष्ट रूप से इसे लोड करने के लिए किया था के विपरीत।


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

उपरोक्त उदाहरण के अनुसार, हम एक मार्ग के तहत विभिन्न HTTP अनुरोध विधि जोड़ सकते हैं।


5

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

var express = require('express');
var parent = express();

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

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

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

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

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

parent.use('/aboutme',  aboutme);

और एक शॉट में पैरेंट फाइल इस तरह दिखती है

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

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


1
क्या यह नहीं होना चाहिए parent.use('/aboutme', child)?
कीस डे कूटर

2

मार्गों को लिखने के लिए app.js का उपयोग करने का अर्थ है कि वे सभी उपयोगकर्ताओं के लिए सुलभ हैं, क्योंकि एप्लिकेशन स्टार्ट किए गए हैं। हालाँकि, मार्गों को एक्सप्रेस.उटर () में डालकर मिनी ऐप उनकी पहुंच को सुरक्षित और प्रतिबंधित करते हैं।


2

express.Router कई विकल्प हैं:

  • केस सेंसिटिविटी को सक्षम करें: /showमार्ग समान नहीं है /Show, यह व्यवहार डिफ़ॉल्ट रूप से अक्षम है
  • सख्त राउटिंग मोड: /show/मार्ग के समान नहीं है /show, यह व्यवहार भी डिफ़ॉल्ट रूप से अक्षम है
  • हम विशिष्ट मार्गों में विशिष्ट मिडिलवेयर / एस जोड़ सकते हैं

0

एक शब्द में, express.Routerतुलना करने पर अधिक काम कर सकते हैं app.get(), जैसे कि मिडलवेयर, इसके अलावा, आप एक और राउटर ऑब्जेक्ट को परिभाषित कर सकते हैंexpress.Router()

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