নোড.জেএস / এক্সপ্রেস.জেএস - অ্যাপ.রোটার কীভাবে কাজ করে?


298

আমার সম্পর্কে জিজ্ঞাসা করার আগে আমার app.routerমনে হয় মিডলওয়্যারের সাথে কাজ করার সময় আমার মনে হয় কি হবে কমপক্ষে আমার ব্যাখ্যা করা উচিত। মিডলওয়্যার ব্যবহার করার জন্য, ব্যবহারের ফাংশনটি হ'ল app.use()। মিডলওয়্যারটি কার্যকর করা হচ্ছে, এটি হয় পরবর্তী মিডওয়্যারটি ব্যবহার করে কল করবে next()বা এটিকে আর মিডলওয়্যার হিসাবে কল করা হবে না । এর অর্থ হল যে আমি আমার মিডলওয়্যার কলগুলি যে ক্রমে রেখেছি তা গুরুত্বপূর্ণ, কারণ কিছু মিডলওয়্যার অন্যান্য মিডলওয়্যারের উপর নির্ভর করে, এবং কিছু মিডলওয়্যার শেষের কাছাকাছি যেতে পারে না।

আজ আমি আমার অ্যাপ্লিকেশনটিতে কাজ করছিলাম এবং আমার সার্ভারটি ব্যাকগ্রাউন্ডে চলছিল। আমি কিছু পরিবর্তন করতে এবং আমার পৃষ্ঠাটি রিফ্রেশ করতে এবং অবিলম্বে পরিবর্তনগুলি দেখতে চেয়েছিলাম। বিশেষত, আমি আমার বিন্যাসে পরিবর্তন আনছিলাম। আমি এটি কাজ করতে পারি না তাই উত্তরের জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করে এই প্রশ্নটি পেয়েছি । এটি express.static()নীচে রয়েছে তা নিশ্চিত করতে বলে require('stylus')। তবে আমি যখন ওপি-র কোডটি দেখছিলাম, তখন আমি দেখতে পেলাম যে app.routerতাঁর মিডলওয়্যারের কলগুলির একেবারে শেষে তাঁর কল ছিল এবং আমি কেন তা জানার চেষ্টা করেছি।

আমি যখন আমার এক্সপ্রেস.জেএস অ্যাপ্লিকেশন (সংস্করণ .0.০.০ আরসি ৪) তৈরি করি, তখন আমি কমান্ডটি ব্যবহার করি express app --sessions --css stylusএবং আমার অ্যাপ্লিকেশন। Js ফাইলে কোডটি আমার app.routerউপরের উভয় express.static()এবং require('stylus')কলগুলির সাথে সেটআপ হয় । সুতরাং এটির মতো মনে হচ্ছে, যদি এটি ইতিমধ্যে সেটআপ হয়ে আসে তবে তা সেভাবেই থাকা উচিত।

আমার কোডটি পুনরায় সাজানোর পরে যাতে আমি আমার স্টাইলাসের পরিবর্তনগুলি দেখতে পেলাম, এটিকে দেখে মনে হচ্ছে:

app.configure(function(){
  //app.set() calls
  //app.use() calls
  //...
  app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});

app.get('/', routes.index);

app.get('/test', function(req, res){
  res.send('Test');
});

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

তো এই হলো আমার প্রশ্ন:

কেউ দয়া করে কী কী app.routerতা ব্যাখ্যা করতে পারে, এর গুরুত্ব এবং আমার মিডওয়্যার কলগুলিতে আমার এটি কোথায় রাখা উচিত? আমি সম্পর্কে একটি সংক্ষিপ্ত বিবরণ পেলে এটিও ভাল হবে express.static()। আমি যতদূর বলতে পারি, express.static()আমার তথ্যের একটি ক্যাশে, এবং যদি অ্যাপ্লিকেশনটি অনুরোধ করা পৃষ্ঠাটি না খুঁজে পায়, এটি ক্যাশে রয়েছে কিনা তা পরীক্ষা করে দেখবে।


18
এই প্রশ্ন জিজ্ঞাসা করার জন্য আপনাকে ধন্যবাদ। আমি এই উত্তরটি খুঁজতে (এবং এটি জিজ্ঞাসা করার প্রশ্নটি) খুঁজে পেতে ঘুরতে যাচ্ছি।
হরি সেলডন

8
এটি সত্যিই একটি ভাল লিখিত প্রশ্ন ছিল, আমি একই জিনিস গুগল করছি।
কিরন

উত্তর:


329

দ্রষ্টব্য: এটি বর্ণনা করে যে এক্সপ্রেস কীভাবে 2 এবং 3 সংস্করণে কাজ করেছে 4 এক্সপ্রেস সম্পর্কিত তথ্যের জন্য এই পোস্টের শেষে দেখুন।


staticকেবল ডিস্ক থেকে ফাইল ( স্থিতিশীল সংস্থান) পরিবেশন করে । আপনি এটিকে একটি পাথ দেন (কখনও কখনও মাউন্ট পয়েন্টও বলে থাকেন) এবং এটি সেই ফোল্ডারে থাকা ফাইলগুলি পরিবেশন করে।

উদাহরণস্বরূপ, express.static('/var/www')সেই ফোল্ডারে ফাইলগুলি পরিবেশন করা হবে। সুতরাং আপনার নোড সার্ভারের জন্য একটি অনুরোধ http://server/file.htmlপরিবেশন করা হবে /var/www/file.html

routerআপনার কোডগুলি চালিত করে এমন কোড। আপনি যখন তা করবেন app.get('/user', function(req, res) { ... });, এটা routerযে আসলে অনুরোধ প্রক্রিয়া করতে কলব্যাক ফাংশন ডাকে।

app.useপ্রতিটি মিডলওয়্যারের একটি অনুরোধ প্রক্রিয়া করার সুযোগ দেওয়া হয় সেই আদেশটি নির্ধারণ করার জন্য আপনি যে অর্ডার দিয়ে জিনিসগুলি পাস করেন সে আদেশটি। উদাহরণস্বরূপ, test.htmlআপনার স্ট্যাটিক ফোল্ডারে এবং একটি রুটে যদি আপনার কাছে কোনও ফাইল ডাকা হয়:

app.get('/test.html', function(req, res) {
    res.send('Hello from route handler');
});

কোন এক ক্লায়েন্ট অনুরোধ পাঠানো হয় http://server/test.html? যার মাঝারিটি useপ্রথম দেওয়া হয় ।

আপনি যদি এটি করেন:

app.use(express.static(__dirname + '/public'));
app.use(app.router);

তারপরে ডিস্কে ফাইলটি পরিবেশন করা হয়।

আপনি যদি এটি অন্যভাবে করেন তবে

app.use(app.router);
app.use(express.static(__dirname + '/public'));

তারপরে রুট হ্যান্ডলারটি অনুরোধটি পেয়ে যায় এবং ব্রাউজারে "হ্যালো থেকে রুট হ্যান্ডলার" পাঠানো হয়।

সাধারণত, আপনি স্ট্যাটিক মিডলওয়্যারের উপরে রাউটারটি রাখতে চান যাতে দুর্ঘটনাযুক্ত-নামক ফাইলটি আপনার কোনও একটি রুটকে ওভাররাইড করতে না পারে।

মনে রাখবেন যে আপনি যদি স্পষ্টভাবে useনা যান router, এটি এক্সপ্রেসের মাধ্যমে স্পষ্টভাবে যুক্ত করা হয় আপনি যে কোনও রুট সংজ্ঞায়িত করেছেন (সেই কারণেই আপনি মন্তব্য করার পরেও আপনার রুটগুলি এখনও কাজ করেছিল app.use(app.router))।


একজন কমেন্টার অর্ডার সম্পর্কে আর একটি বিষয় তুলে ধরেছে staticএবং routerআমি এর সমাধান করিনি: আপনার অ্যাপের সামগ্রিক পারফরম্যান্সে প্রভাব।

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

সঙ্গে routerপ্রথম, কখনও একটি রুট মিলে একটি অনুরোধ বহুমূল্য মিলিসেকেন্ড সংরক্ষণ, ডিস্ক আঘাত করতে হবে।

অবশ্যই, staticওভারহেড প্রশমিত করার উপায় রয়েছে ।

সর্বোত্তম বিকল্পটি হ'ল আপনার সমস্ত স্থিতিশীল সংস্থানগুলিকে একটি নির্দিষ্ট ফোল্ডারের নীচে রাখা। (IE /static) আপনি তখন staticসেই পথে আরোহণ করতে পারেন যাতে পথটি কেবল তখনই শুরু হয় /static:

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

এই পরিস্থিতিতে, আপনি এটি উপরে রাখবেন router। এটি যদি কোনও ফাইল উপস্থিত থাকে তবে অন্যান্য মিডলওয়্যার / রাউটারকে প্রক্রিয়াজাতকরণ এড়াতে পারে, তবে সত্যি কথা বলতে আমি সন্দেহ করি যে আপনি এতটা অর্জন করবেন।

আপনি ব্যবহার করতে পারেন staticCacheযা মেমরির স্থিতিশীল সংস্থানগুলিকে ক্যাশে করে যাতে সাধারণত অনুরোধ করা ফাইলগুলির জন্য আপনাকে ডিস্কে আঘাত করতে না হয়। ( সতর্কতা: staticCache স্পষ্টতই ভবিষ্যতে অপসারণ করা হবে ।)

যাইহোক, আমি মনে করি না staticCacheনেতিবাচক উত্তরগুলি (যখন কোনও ফাইল উপস্থিত না থাকে), সুতরাং এটি কোনও পাথে না মাউন্ট করে staticCacheউপরে রাখলে কোনও লাভ হয় না router

কর্মক্ষমতা সম্পর্কে সমস্ত প্রশ্নের মতোই, বাধা কোথায় রয়েছে তা দেখতে আপনার আসল-ওয়ার্ল্ড অ্যাপ (লোডের নীচে) পরিমাপ করুন এবং বেঞ্চমার্ক করুন


এক্সপ্রেস 4

এক্সপ্রেস 4.0 সরান app.router । সমস্ত মিডলওয়্যার ( app.use) এবং রুট ( app.getএট আল) এখন সেগুলি যুক্ত করা হয় সেই ক্রমে সঠিকভাবে প্রক্রিয়াজাত করা হয়।

অন্য কথায়:

সমস্ত রাউটিং পদ্ধতিগুলি যে ক্রমে প্রদর্শিত হবে সেটিতে যুক্ত করা হবে। আপনি উচিত না কি app.use(app.router)। এটি এক্সপ্রেসের সাথে সর্বাধিক সাধারণ সমস্যাটি সরিয়ে দেয়।

অন্য কথায়, মিক্সিং app.use()এবং ঠিক সেই ক্রমে app[VERB]()কাজ করবে যাতে তারা ডাকা হয়।

app.get('/', home);
app.use('/public', require('st')(process.cwd()));
app.get('/users', users.list);
app.post('/users', users.create);

এক্সপ্রেস 4 পরিবর্তন সম্পর্কে আরও পড়ুন।


2
routerএক জায়গায় চলে যায়। যদি আপনি প্রথমবার কল করেন app.get(বা postঅন্যদের), আপনি এখনও useডি করেননি app.router, এক্সপ্রেস এটি আপনার জন্য যুক্ত করে।
josh3736

4
@ মাইককোজার: না, কারণ ডিস্ক অ্যাক্সেসের ওভারহেডটি (কোনও ফাইল উপস্থিত রয়েছে কি না তা দেখতে) ফাংশন অনুরোধের ওভারহেডের চেয়ে বড়। আমার পরীক্ষায় , এই ওভারহেডটি একটি আনলোড লোড সার্ভারে 1 মিমি পরিমাণে। এটি লোডের নিচে বেশি হওয়ার সম্ভাবনা রয়েছে, যেখানে অনুরোধগুলি ডিস্ক অ্যাক্সেসের জন্য প্রতিযোগিতা করবে। সঙ্গে staticপরে router, অন্যান্য মিডলওয়্যার প্রশ্ন যেহেতু এটি অপ্রাসঙ্গিক হয়ে আবশ্যক রাউটার উপরে হতে হবে।
josh3736

2
অপূর্ব ব্যাখ্যা! তোমাকে অনেক ধন্যবাদ!
কিরন

3
app.routerহয় মুছে বর্তমান মাস্টার শাখা, যা হতে হবে দ্রুতগামী-4.0 । প্রতিটি রুট আলাদা মিডলওয়্যার হয়ে যায়।
ইয়ানিচর

3
আরও একটি স্পষ্টতা, আমি এই কাজ হিসাবে। এক্সপ্রেস 4 এ, একাধিক রুট একটি রাউটারে নির্ধারিত হতে পারে এবং তারপরে রাউটারটি ব্যবহারের জন্য, রাউটারটি একটি মূল পাথ দেওয়া হয় এবং অ্যাপ.ইউজ (পাথ, রাউটার) এর মাধ্যমে "মিডলওয়্যার" স্ট্যাকে স্থাপন করা হয়। এটি প্রত্যেকের সাথে সম্পর্কিত রুটগুলিকে তাদের নিজস্ব রাউটার ব্যবহার করতে এবং ইউনিট হিসাবে একটি বেস পাথ নির্ধারিত করার অনুমতি দেয়। যদি আমি এটি আরও ভালভাবে বুঝতে পারি তবে আমি অন্য উত্তর পোস্ট করার প্রস্তাব দেব। আবার, আমি এটি স্কচ.আইও
জো ল্যাপ

2

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

এক্সপ্রেস 4.0.০ রাউটারে, আমাদের রুটগুলি সংজ্ঞায়িত করার ক্ষেত্রে আমাদের আগের তুলনায় আরও নমনীয়তা দেওয়া হয়।

এক্সপ্রেস.উইটার () রুটগুলির গোষ্ঠীগুলি সংজ্ঞায়িত করতে একাধিকবার ব্যবহার করা হয়।

অনুরোধগুলি প্রক্রিয়া করার জন্য মিডলওয়্যার হিসাবে ব্যবহৃত রুট।

".param ()" ব্যবহার করে প্যারামিটারগুলি বৈধ করতে মিডলওয়্যার হিসাবে ব্যবহৃত রুট।

app.route () একটি রুটে একাধিক অনুরোধ সংজ্ঞায়িত করতে রাউটারটির শর্টকাট হিসাবে ব্যবহৃত

আমরা যখন app.route () ব্যবহার করছি তখন আমরা সেই রাউটার দিয়ে আমাদের অ্যাপ্লিকেশনটি সংযুক্ত করছি।

var express = require('express'); //used as middleware
var app = express(); //instance of express.
app.use(app.router);
app.use(express.static(__dirname + '/public')); //All Static like [css,js,images] files are coming from public folder
app.set('views',__dirname + '/views'); //To set Views
app.set('view engine', 'ejs'); //sets View-Engine as ejs
app.engine('html', require('ejs').renderFile); //actually rendering HTML files through EJS. 
app.get('/', function (req, res) {
  res.render('index');  
})
app.get('/test', function (req, res) {
  res.send('test')
})

0

এক্সপ্রেস সংস্করণ ৪ এ আমরা নিম্নলিখিত পদ্ধতিতে রুটগুলি সহজেই সংজ্ঞায়িত করতে পারি:

server.js:

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

app.use('/route', route);
// here we pass in the imported route object

app.listen(3000, () => console.log('Example app listening on port 3000!'));

route.js:

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

router.get('/specialRoute', function (req, res, next) {
     // route is now http://localhost:3000/route/specialRoute
});

router.get('/', function (req, res, next) {
    // route is now http://localhost:3000/route
});

module.exports = router;

ইন server.jsআমরা রাউটার বস্তুর আমদানিকৃত route.jsফাইল এবং নিম্নলিখিত পদ্ধতিতে এটি প্রয়োগ server.js:

app.use('/route', route);

এখন সমস্ত রুটের route.jsনীচের বেস URL রয়েছে:

HTTP: // স্থানীয় হোস্ট: 3000 / রুট

কেন এই পদ্ধতির:

এই পদ্ধতির গ্রহণের মূল সুবিধাটি হ'ল এখন আমাদের অ্যাপটি আরও বেশি মডুলার । নির্দিষ্ট রুটের সমস্ত রুট হ্যান্ডলারকে এখন বিভিন্ন ফাইলে রাখা যেতে পারে যা সবকিছুকে আরও রক্ষণাবেক্ষণযোগ্য এবং সন্ধান করা সহজ করে তোলে।

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