নোড.জেএস এক্সপ্রেসের মধ্যে app.all('*', ... )
এবং এর app.use('/', ...)
মধ্যে কি কোনও কার্যকর পার্থক্য রয়েছে ?
নোড.জেএস এক্সপ্রেসের মধ্যে app.all('*', ... )
এবং এর app.use('/', ...)
মধ্যে কি কোনও কার্যকর পার্থক্য রয়েছে ?
উত্তর:
বেশিরভাগ ক্ষেত্রে তারা সমানভাবে কাজ করবে would বৃহত্তম পার্থক্য হ'ল মিডলওয়্যারটি প্রয়োগ করা হবে এমন ক্রম:
app.all()
অ্যাপ্লিকেশনটির রাউটারের সাথে সংযুক্ত থাকে, তাই এটি যখনই প্রয়োগ হয় যখনই app.router মিডলওয়্যারটি পৌঁছে যায় (যা সমস্ত পদ্ধতির রুটগুলি পরিচালনা করে ... GET, POST, ইত্যাদি)।বিজ্ঞপ্তি: app.router 4.x এক্সপ্রেস এ অবচয় করা হয়েছে
app.use()
অ্যাপ্লিকেশনটির প্রধান মিডলওয়্যার স্ট্যাক সংযুক্ত করে, তাই এটি মিডওয়্যারের দ্বারা নির্দিষ্ট ক্রমে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি যদি এটি প্রথম রাখেন তবে এটি প্রথম চালানো হবে। আপনি যদি এটি শেষ রাখেন, (রাউটারের পরে), এটি সাধারণত চালানো হবে না।সাধারণত, আপনি যদি সমস্ত রুটে বিশ্বব্যাপী কিছু করতে চান তবে অ্যাপ.ইউজ () সেরা বিকল্প। এছাড়াও, এটিতে ভবিষ্যতের বাগগুলি কম সম্ভাবনা রয়েছে, যেহেতু এক্সপ্রেস 0.4 সম্ভবত অন্তর্নিহিত রাউটারটি ফেলে দেবে (অর্থাত্ মিডলওয়্যারের মধ্যে রাউটারের অবস্থানটি বর্তমানে এটির চেয়ে বেশি গুরুত্বপূর্ণ হবে, যেহেতু আপনি প্রযুক্তিগতভাবে এটি ব্যবহার করতে হবে না এখনই)।
next("route")
সঙ্গে ব্যবহার করতে পারেন app.all
, কিন্তু সঙ্গে না app.use
।
app.use শুধুমাত্র একটি কলব্যাক ফাংশন নেয় এবং এটি মিডওয়্যারের জন্য বোঝায়। মিডলওয়্যার সাধারণত অনুরোধ এবং প্রতিক্রিয়া হ্যান্ডেল করে না (প্রযুক্তিগতভাবে তারা পারে) তারা কেবল ইনপুট ডেটা প্রসেস করে এবং পরের হ্যান্ডলারের কাতারে হস্তান্তর করে।
app.use([path], function)
app.all একাধিক কলব্যাক নেয় এবং রাউটিংয়ের জন্য বোঝায়। একাধিক কলব্যাকের সাহায্যে আপনি অনুরোধগুলি ফিল্টার করতে এবং প্রতিক্রিয়াগুলি পাঠাতে পারেন। এটি এক্সপ্রেস.জেএস-তে ফিল্টারগুলিতে ব্যাখ্যা করা হয়েছে
app.all(path, [callback...], callback)
অ্যাপ্লিকেশন.উপস কেবলমাত্র url নির্দিষ্ট পথ দিয়ে শুরু হয় কিনা তা কেবল দেখে
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all সম্পূর্ণ পাথের সাথে মিলবে
app.all( "/product" , handler);
// will match /product
// won't match /product/cool <-- important
// won't match /product/foo <-- important
app.all( "/product/*" , handler);
// won't match /product <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo
app.use:
app.all:
এই এক্সপ্রেসজেস কোড নমুনা দেখুন:
var express = require('express');
var app = express();
app.use(function frontControllerMiddlewareExecuted(req, res, next){
console.log('(1) this frontControllerMiddlewareExecuted is executed');
next();
});
app.all('*', function(req, res, next){
console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
next();
});
app.all('/hello', function(req, res, next){
console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
next();
});
app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
next();
});
app.get('/hello', function(req, res){
console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
res.send('Hello World');
});
app.listen(80);
'/ হ্যালো' রুটে অ্যাক্সেস করার সময় লগটি এখানে:
(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response
এর সাথে app.use()
, "মাউন্ট" পথটি ছিনিয়ে নেওয়া হয়েছে এবং মিডওয়্যার ফাংশনে দৃশ্যমান নয়:
app.use('/static', express.static(__dirname + '/public'));
মাউন্ট করা মিডওয়াল ফাংশন ( express.static
) req.url
এতে এই উপসর্গ ( /static
) না উপস্থিত থাকে না, যদি ফাংশনটি শুরু করা হয় তখন এটি ছিনিয়ে নেওয়া হয়।
সাথে app.all()
, এমন কোনও আচরণ নেই।
হ্যাঁ, app.all()
কোনও নির্দিষ্ট ইউআরআইকে যে কোনও ধরণের অনুরোধ পদ্ধতির (পোষ্ট, জিইটি, পুট, বা মুছে ফেলা) অনুরোধ করা হলে কল করা হবে
অন্যদিকে আপনার যে app.use()
কোনও মিডলওয়্যার থাকতে পারে তার জন্য ব্যবহার করা হয় এবং এটি কোনও পূর্ব উপগ্রহের উপর মাউন্ট করে যায় এবং যে কোনও সময় সেই রুটের নীচে কোনও ইউআরআই বলা হবে।
এখানে app.all এবং app.use এর জন্য ডকুমেন্টেশন রয়েছে ।
উপরের সমস্ত উত্তর দুটি পার্থক্য প্রশ্রয় দেয় না।
প্রথম এক: app.all
একটি রেজেক্সকে তার পরামিতি হিসাবে গ্রহণ করে। app.use
একটি রেজেক্স গ্রহণ করে না।
দ্বিতীয়:
app.all(path,handler)
বা app[method](path,handler)
, হ্যান্ডলার এর path
একই হওয়া আবশ্যক সব path
। এটি হল, অ্যাপ [পদ্ধতি] এর পথ সম্পূর্ণ complete
app.use(path,hanlder)
, যদি ব্যবহারের পথটি সম্পূর্ণ হয়, তবে হ্যান্ডেলারটির পথটি অবশ্যই '/' হতে হবে if
app.use('/users', users);
//users.js: the handler will be called when matchs `/user/` path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
// others.js: the handler will be called when matchs `/users/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
app.all('/users', users);
//others.js: the handler wil be called when matchs `/`path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
//users.js: the handler will be called when matchs `/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
দুটি প্রধান পার্থক্য রয়েছে:
1. প্যাটার্ন ম্যাচিং (পালানী প্রদত্ত উত্তর)
২. next(route)
মিডলওয়্যার ব্যবহার করে লোড করা ফাংশন বডিটির অভ্যন্তরে কাজ করবে না app.use
। এটি ডক্স থেকে লিঙ্কে বলা হয়েছে:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
লিঙ্ক: http://expressjs.com/en/guide/using-moodware.html
এর কার্যকারী প্রভাবটি next('route')
নিম্নলিখিত উদাহরণ থেকে দেখা যাবে:
app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();} //skipped
);
//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});