App.all ('*') এবং app.use ('/') এর মধ্যে পার্থক্য


121

নোড.জেএস এক্সপ্রেসের মধ্যে app.all('*', ... )এবং এর app.use('/', ...)মধ্যে কি কোনও কার্যকর পার্থক্য রয়েছে ?

উত্তর:


119

বেশিরভাগ ক্ষেত্রে তারা সমানভাবে কাজ করবে would বৃহত্তম পার্থক্য হ'ল মিডলওয়্যারটি প্রয়োগ করা হবে এমন ক্রম:

  • app.all() অ্যাপ্লিকেশনটির রাউটারের সাথে সংযুক্ত থাকে, তাই এটি যখনই প্রয়োগ হয় যখনই app.router মিডলওয়্যারটি পৌঁছে যায় (যা সমস্ত পদ্ধতির রুটগুলি পরিচালনা করে ... GET, POST, ইত্যাদি)।

বিজ্ঞপ্তি: app.router 4.x এক্সপ্রেস এ অবচয় করা হয়েছে

  • app.use()অ্যাপ্লিকেশনটির প্রধান মিডলওয়্যার স্ট্যাক সংযুক্ত করে, তাই এটি মিডওয়্যারের দ্বারা নির্দিষ্ট ক্রমে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি যদি এটি প্রথম রাখেন তবে এটি প্রথম চালানো হবে। আপনি যদি এটি শেষ রাখেন, (রাউটারের পরে), এটি সাধারণত চালানো হবে না।

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


15
এক্সপ্রেস 4.x এর পরেও কি এটি প্রযোজ্য? app.router সরানো হয়েছে।
রাফ্রে

1
আপনি next("route")সঙ্গে ব্যবহার করতে পারেন app.all, কিন্তু সঙ্গে না app.use
জোজেফ মিকুয়েনিক

@ জোজেফমিকুসিনেক ডকুমেন্টেশন অন্যথায় প্রস্তাবিত বলে মনে হচ্ছে ... এক্সপ্রেসস /en/guide/writing-middleware.html
musicin3d

আপনার লিঙ্কটি পরবর্তী ('রুট') উল্লেখ করে না, তবে আমি এপিআইয়ের দিকে চেয়েছি, আপনি ঠিক বলেছেন।
জোজেফ মিকুয়েনিক

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

87

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

17
কমপক্ষে ভি 4-এ, অ্যাপ.উস "একমাত্র" নয়, এক বা একাধিক মিডলওয়্যার ফাংশন নেয় ।
জেস অস্টিন

2
অ্যাপ্লিকেশন ব্যবহার করুন কেবলমাত্র ইউআরএল নির্দিষ্ট পথ দিয়ে শুরু হয় কিনা তা দেখুন; অ্যাপ্লিকেশন সমস্ত সম্পূর্ণ পাথের সাথে মিলবে। এটি প্রধান পার্থক্য।
meizilp

@ ফ্রোগসিএনএন এটি কোনওভাবেই * এবং / আমার প্রশ্নে উপেক্ষা করার মতো নয়।
ostergaard

15
  • app.use:

    1. উদাহরণস্বরূপ আপনার সামনের নিয়ামক কনফিগার করার জন্য মিডলওয়্যার ইনজেক্ট করুন: শিরোনাম, কুকিজ, সেশন ইত্যাদি etc.
    2. অ্যাপ্লিকেশানের আগে অবশ্যই লিখিত হতে হবে [http_method] অন্যথায় কার্যকর করা হবে না।
    3. বিভিন্ন কল লেখার ক্রম প্রসেস করা হয়
  • app.all:

    1. (অ্যাপ্লিকেশন [http_method] এর মতো) রুটের নিয়ন্ত্রণকারীদের কনফিগার করতে ব্যবহৃত হয়
    2. "সমস্ত" এর অর্থ এটি সমস্ত HTTP পদ্ধতিতে প্রযোজ্য।
    3. বিভিন্ন কল লেখার ক্রম প্রসেস করা হয়

এই এক্সপ্রেসজেস ​​কোড নমুনা দেখুন:

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

6
4.x এক্সপ্রেসে এই উদাহরণটি ভারব্যাটিম চালানোর পরে, এটি আসলে সমস্ত 5 ক্রমে চালায়। এটি সম্ভবত প্রায় 3 বছরে প্রকাশিত পরিবর্তনের কারণে এটি লেখা হয়েছিল, তবে আমি কেবল ভেবেছিলাম এটি পরিষ্কার করার জন্য যুক্ত করব।
নাথান ওয়েবি

11

এর সাথে app.use(), "মাউন্ট" পথটি ছিনিয়ে নেওয়া হয়েছে এবং মিডওয়্যার ফাংশনে দৃশ্যমান নয়:

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

মাউন্ট করা মিডওয়াল ফাংশন ( express.static) req.urlএতে এই উপসর্গ ( /static) না উপস্থিত থাকে না, যদি ফাংশনটি শুরু করা হয় তখন এটি ছিনিয়ে নেওয়া হয়।

সাথে app.all(), এমন কোনও আচরণ নেই।


প্রশ্নটি স্পষ্টভাবে app.use ('/', ...) সম্পর্কে জিজ্ঞাসা করে।
ostergaard

এটি সেই প্রশ্নের সঠিক উত্তর যা এখনও 2018 সালে সত্য! মিডলওয়্যারটি সমস্ত () দিয়েও মাউন্ট করা যায় ... পার্থক্যটি হ'ল মিডওয়্যারটি চালানোর সময় মাউন্ট পাথটি ছিঁড়ে যায়।
জাতিয়ান

4

হ্যাঁ, app.all()কোনও নির্দিষ্ট ইউআরআইকে যে কোনও ধরণের অনুরোধ পদ্ধতির (পোষ্ট, জিইটি, পুট, বা মুছে ফেলা) অনুরোধ করা হলে কল করা হবে

অন্যদিকে আপনার যে app.use()কোনও মিডলওয়্যার থাকতে পারে তার জন্য ব্যবহার করা হয় এবং এটি কোনও পূর্ব উপগ্রহের উপর মাউন্ট করে যায় এবং যে কোনও সময় সেই রুটের নীচে কোনও ইউআরআই বলা হবে।

এখানে app.all এবং app.use এর জন্য ডকুমেন্টেশন রয়েছে


ধন্যবাদ তবে আমি মনে করি আপনি অ্যাপ্লিকেশনটি মিস করেছেন wild সমস্ত ওয়াইল্ডকার্ড এবং অ্যাপ্লিকেশন root ব্যবহারের মূলের পথটি যা তাদের প্রায় একই জিনিস তৈরি করে না? অ্যাপ্লিকেশনটি বাদে all সমস্ত কলব্যাকের একটি অ্যারে নিতে পারে এবং অ্যাপ্লিকেশন ব্যবহার কেবল একটি নিতে পারে - ডান?
অস্টগার্ড

1

উপরের সমস্ত উত্তর দুটি পার্থক্য প্রশ্রয় দেয় না।

প্রথম এক: 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');
 });

0

দুটি প্রধান পার্থক্য রয়েছে:

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();});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.