এক্সপ্রেস.রউটার এবং অ্যাপ.জেটের মধ্যে পার্থক্য?


265

আমি নোডজেএস এবং এক্সপ্রেস 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
একটি নিজস্ব অনুরোধের জন্য Routerনা .listen()। এটি আপনার অ্যাপ্লিকেশনটিকে একাধিক মডিউলগুলিতে পৃথক করার জন্য দরকারী - Routerপ্রতিটি যা করতে appপারে require()এবং .use()মিডওয়্যার হিসাবে একটি তৈরি করে ।
জোনাথন লোনোস্কি

5
@ জোনাথনলোনস্কি যেমন ইঙ্গিত করেছেন, app.get(..)সিনট্যাক্সটি express.routerআরও সুবিধাজনকভাবে কাজ করার জন্য একটি শর্টকাট । যদি আপনি সবে শুরু করছেন, রাউটারের বিশদ সম্পর্কে চিন্তা করবেন না।
soulprovidr

1
সুতরাং আপনি বলছেন যে মুহুর্তের জন্য আমার কেবল অ্যাপ্লিকেশনটি ব্যবহার করা উচিত? এখনও কখন একজন বা অন্যটি ব্যবহার করবেন সে সম্পর্কে বিভ্রান্ত
নেলসন 687

11
@ nelson687 তাদের মধ্যে সত্যিই কোনও হার্ড-সেট নিয়ম নেই। আপনি যদি app'sনিজের রুটিং পদ্ধতিগুলি যেমন app.get()আপনার প্রয়োজনের জন্য যথেষ্ট অনুভব করেন তবে সেগুলি ব্যবহার করুন। Routerঠিক আছে সুবিধার আপনি একাধিক মডিউল জুড়ে আবেদন সংগঠিত করতে সহায়তা করতে হয়। নির্দেশিকা থেকে : " বর্গ মডুলার অরোহণযোগ্য রুট হ্যান্ডেলার তৈরি করতে ব্যবহার করা যেতে পারে একটি। উদাহরণস্বরূপ সম্পূর্ণ মিডলওয়্যার এবং রাউটিং সিস্টেম; এই কারণে এটা প্রায়ই একটি হিসাবে উল্লেখ করা হয়" মিনি-অ্যাপ "। "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()ডাকা হয় তখন কিছুটা আলাদা মিনি অ্যাপটি ফিরে আসে। মিনি অ্যাপ্লিকেশনটির পিছনে ধারণাটি হ'ল আপনার অ্যাপ্লিকেশনটির প্রতিটি রুট বেশ জটিল হয়ে উঠতে পারে এবং আপনি এই কোডটি একটি পৃথক ফাইলে স্থানান্তরিত করে উপকৃত হবেন। প্রতিটি ফাইলের রাউটার একটি হয়ে মিনি অ্যাপ্লিকেশন , যা করার জন্য একটি অনুরূপ গঠন হয়েছে প্রধান অ্যাপ্লিকেশানটিতে

উপরের উদাহরণে, / কুকুরের রুটের কোডটিকে তার নিজস্ব ফাইলে স্থানান্তরিত করা হয়েছে যাতে এটি মূল অ্যাপটিকে বিশৃঙ্খলা না করে । / বিড়াল এবং / পাখিদের জন্য কোডগুলি তাদের নিজস্ব ফাইলে একইভাবে কাঠামোগত করা হবে। এই কোডটি তিনটি মিনি অ্যাপ্লিকেশনে পৃথক করে , আপনি বিচ্ছিন্নভাবে প্রতিটিটির জন্য যুক্তিতে কাজ করতে পারেন, এবং এটি কীভাবে অন্যান্য দুটিতে প্রভাব ফেলবে তা নিয়ে চিন্তা করবেন না।

আপনার যদি তিনটি রুটের সাথে সম্পর্কিত (মিডলওয়্যার) কোড থাকে তবে আপনি কল করার আগে এটি মূল অ্যাপে রাখতে পারেন in app.use(...)যদি আপনার কাছে কোড (মিডলওয়্যার) থাকে যা সেই রুটের মধ্যে একটির সাথে সম্পর্কিত তবে আপনি কেবলমাত্র সেই রুটের জন্য ফাইলটিতে রাখতে পারেন।


আপনি app.use('/dogs', dogs)(app)সেখানে রুটগুলি সংজ্ঞায়িত করার পরে অ্যাপ্লিকেশন অবজেক্টটি পাস করতে হবে না, অতিরিক্তভাবে (এবং আমি ভুল হলে আমাকে সংশোধন করুন) আপনি যদি এইভাবে করেন তবে অ্যাপ্লিকেশনটির মাঝারি ওয়্যারটির সমস্ত পূর্ববর্তী জিনিস রয়েছে এবং অ্যাপ্লিকেশন অবজেক্টে অতিরিক্ত মিডল ওয়্যার যুক্ত করা হবে (ধরে নিবেন কুকুরের রাস্তায় আরও মাঝারি ওয়্যার রয়েছে)। যদি আপনি route.get('/dogs', route)এটি ব্যবহার করেন তবে কেবলমাত্র সেই রাউটারে সংজ্ঞায়িত রুটের সাথে ইন্টারঅ্যাক্ট করার সময় অ্যাপ্লিকেশন অবজেক্টের মাঝারি ওয়্যারটি পাস হয় এবং যদি অ্যাপ্লিকেশনের সুযোগটি রাস্তার বাইরে থাকে তবে এর মাঝারি ওয়্যারটিতে অ্যাক্সেস নেই।
রেভেনস

1
আপনাকে রুটে অ্যাপটি পাস করার দরকার নেই, কারণ এই রুটটি অ্যাপ্লিকেশনটিতে পাস হচ্ছে app.use('/dogs', show)। এইভাবে রুটটি অ্যাপ্লিকেশন থেকে স্বতন্ত্র এবং কোনও এক্সপ্রেস অ্যাপ্লিকেশনটিতে পুনরায় ব্যবহার করা যেতে পারে। মিডওয়্যারটি কোনও সেই রুটটি ব্যবহার করার আগে যে কোনও জায়গায় রাখা হয়েছিল। আপনি যদি অ্যাপ.জেজে সমস্ত রুটের উপরে মিডলওয়্যার রাখেন তবে সমস্ত রুট সেই মিডওয়্যারটি ব্যবহার করবে। আপনি যদি কোনও রুট ফাইলে (কুকুর.জেএস) ভিতরে মিডলওয়্যার রাখেন তবে কেবল সেই রুটটি এটি ব্যবহার করবে। যদি আপনি কুকুর.জেএস এর মধ্যে জিইটি রুটের পরে মিডলওয়্যার রাখেন তবে কেবলমাত্র পোষ্ট রুট এটি ব্যবহার করবে (যতক্ষণ না এটি প্রতিক্রিয়া দিয়ে শেষ হয়)।
নোকটারনো

আহ আমার খারাপ। আমি বলতে app.get('/dogs'dogs,)(app)চাইছিলাম যেহেতু প্রশ্নটি app.get এবং রুট.জেটের বৈশিষ্ট্যটি নিয়ে ছিল। আপনি কীভাবে রুটগুলি পরিচালনা করার জন্য পৃথক করবেন তা দেখিয়েছিলেন। তবে আমরা যদি কথা বলি তবে আমার এনাডোটোটো সঠিক হবে না app.get? আমি যদি কোনও পিসিতে উঠতে পারি তবে আমি আমার উপরের মন্তব্যটি সম্পাদনা করব।
রেভেনস

2
আমার অ্যাপ এখনও কাজ করে যখন আমি এক্সপ্রেস ব্যবহার করি ou রাউটার () বা এক্সপ্রেস (), আমি পার্থক্যটি বুঝতে পারি না :(
অজয় সুওয়ালকা

3
@ অজয় ​​সুওয়ালকা আমি জানি না যে আমি ইতিমধ্যে যা বলেছি তাতে কীভাবে আমি আরও বিস্তৃত করতে পারি। দস্তাবেজগুলি বলে "একটি রাউটার অবজেক্ট মিডলওয়্যার এবং রুটের একটি বিচ্ছিন্ন উদাহরণ"। আমি উপরে @ জোনাথন লোনোস্কির মন্তব্যটিও পছন্দ করি, "এ নিজে অনুরোধের জন্য 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

ধরা যাক আপনার আবেদনটি খুব জটিল is সুতরাং আমরা প্রথমে যা করি তা হ'ল আমরা অ্যাপ্লিকেশনটিকে একাধিক মডিউলে বিভক্ত করি যাতে একটি মডিউলে পরিবর্তনগুলি অন্যকে বিশৃঙ্খলা না করে এবং আপনি পৃথক মডিউলগুলিতে কাজ চালিয়ে যেতে পারেন, তবে দিনের শেষে আপনাকে সমস্ত কিছু এক সাথে সংহত করতে হবে যেহেতু আপনার একটি একক অ্যাপ্লিকেশন তৈরি করছে। এটি আমাদের মতো একটি প্রধান অ্যাপ্লিকেশন এবং কয়েকটি শিশু অ্যাপ্লিকেশন রয়েছে যার পিতামাতার মূল অ্যাপ্লিকেশন। সুতরাং আমরা যখন প্যারেন্ট অ্যাপ্লিকেশন তৈরি করি তখন আমরা একটি ব্যবহার করে তৈরি করি

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

এবং এই প্যারেন্ট অ্যাপ্লিকেশনটিতে আমাদের শিশু অ্যাপ্লিকেশনগুলি আনতে হবে। তবে যেহেতু চাইল্ড অ্যাপ্লিকেশনগুলি সম্পূর্ণ আলাদা অ্যাপ্লিকেশন নয় (যেহেতু তারা একই প্রসঙ্গে-জাভা শব্দে চালিত হয়), এক্সপ্রেস এক্সপ্রেসের রাউটার ফাংশনটির মাধ্যমে এটি করার উপায় সরবরাহ করে এবং প্রতিটি শিশু মডিউল ফাইলে আমরা এটি করি এবং এরকম একটি শিশু মডিউলকে প্রায় সম্পর্কে কল করতে দিন

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

দ্বারা module.exports আমরা গ্রাস এবং যেহেতু আমরা জিনিস modularized আছে আমরা শুধু অন্য কোন তৃতীয় পক্ষের মডিউল এবং পিতা বা মাতা ফাইল দেখে মনে হচ্ছে ফাংশন প্রয়োজন মডিউল নোড এর মাধ্যমে মূল অ্যাপ্লিকেশানে উপলব্ধ ফাইল করতে হবে অপরের জন্য উপলব্ধ এই মডিউল তৈরি করছেন এটার মতো কিছু.

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

রুটগুলি লিখতে অ্যাপ.জেএস ব্যবহার করার অর্থ অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে অ্যাপ.জেএস লোড হওয়ায় তারা সমস্ত ব্যবহারকারীর কাছে অ্যাক্সেসযোগ্য। তবে এক্সপ্রেস.রোটার () মিনি অ্যাপ্লিকেশনগুলিতে রুটগুলি স্থাপন করা তাদের অ্যাক্সেসযোগ্যতাকে সুরক্ষা এবং সীমাবদ্ধ করে।


2

express.Router অনেক বিকল্প আছে:

  • কেস সংবেদনশীলতা সক্ষম করুন: /showরুট একইরূপে না হওয়ার জন্য /Show, এই আচরণটি ডিফল্টরূপে অক্ষম করা হয়
  • কঠোর রুটিং মোড: /show/রুটটি এর মতো নয় /show, এই আচরণটি ডিফল্টরূপে অক্ষমও করা হয়
  • আমরা নির্দিষ্ট রুটে নির্দিষ্ট মিডলওয়্যার / গুলি যুক্ত করতে পারি

0

একটি কথায়, express.Routerতুলনা করার সময় আরও কিছু করতে পারে app.get()যেমন মিডলওয়্যার, তদতিরিক্ত, আপনি আরও একটি রাউটার অবজেক্টের সাথে সংজ্ঞা দিতে পারেনexpress.Router()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.