এক্সপ্রেস.জেসে অ্যাপ্লিকেশন এবং অ্যাপ্লিকেশন মধ্যে পার্থক্য


220

আমি এক্সপ্রেশন এবং নোড.জেএস করতে নতুন ধরনের, এবং আমি অ্যাপ.উস এবং অ্যাপ.জেটের মধ্যে পার্থক্যটি বুঝতে পারি না। দেখে মনে হচ্ছে আপনি উভয়কেই তথ্য প্রেরণে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

এই হিসাবে একই বলে মনে হচ্ছে:

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

1
দেখে মনে হচ্ছে আপনি তিনটি পৃথক উত্তর পেয়েছেন, সমস্তই এই বিষয়টিতে কিছু অবদান রাখছে :) এখানে একটি সম্পর্কিত প্রশ্ন stackoverflow.com/questions/11321635/…
বেনজামিন গ্রুইনবাউম

হ্যাঁ, সমস্ত ভাল উত্তর। ধন্যবাদ, আমি এটি একবার দেখে নেব
আন্দ্রে ভোরোব্যভ

উত্তর:


219

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

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

/একটি " মাউন্ট " পাথ হিসাবে উল্লেখ করে , app.use()যে পথ থেকে শুরু হবে তার প্রতিক্রিয়া জানাবে /, যেগুলি সমস্তই এবং এইচটিটিপি ক্রিয়াকলাপ নির্বিশেষে:

  • GET /
  • PUT /foo
  • POST /foo/bar
  • প্রভৃতি

app.get()অন্যদিকে, এক্সপ্রেসের অ্যাপ্লিকেশন রুটিংয়ের অংশ এবং এটি GETএইচটিটিপি ক্রিয়াকলাপের সাথে অনুরোধ করা হলে একটি নির্দিষ্ট রুট মেলাতে এবং পরিচালনা করার উদ্দেশ্যে করা হয় :

  • GET /

এবং, আপনার উদাহরণের সমতুল্য রাউটিংটি হ'ল app.use():

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

( আপডেট: পার্থক্যগুলি আরও ভালভাবে প্রদর্শনের চেষ্টা করা হচ্ছে ))

এই রাউটিং পদ্ধতিগুলি সহ app.get()সুবিধামত পদ্ধতি যা আপনাকে অনুরোধগুলির প্রতিক্রিয়াগুলিকে আরও সঠিকভাবে সারিবদ্ধ করতে সহায়তা করে help তারা প্যারামিটার এবং বৈশিষ্ট্যের মতো বৈশিষ্ট্যের জন্য সমর্থন যোগ করে next('route')

প্রত্যেকটির মধ্যেই app.get()একটি কল রয়েছে app.use(), যাতে আপনি অবশ্যই app.use()সরাসরি এগুলি করতে পারেন । তবে, এটি করার জন্য প্রায়শই (সম্ভবত অযৌক্তিকভাবে) বিভিন্ন পরিমাণ বয়লারপ্লিট কোডটি পুনরায় প্রয়োগ করা প্রয়োজন।

উদাহরণ:

  • সহজ, স্থির রুটের জন্য:

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

    বনাম

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
  • একই রুটের একাধিক হ্যান্ডলার সহ:

    app.get('/', authorize('ADMIN'), function (req, res) {
      // ...
    });

    বনাম

    const authorizeAdmin = authorize('ADMIN');
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      authorizeAdmin(req, res, function (err) {
        if (err) return next(err);
    
        // ...
      });
    });
  • পরামিতি সহ:

    app.get('/item/:id', function (req, res) {
      let id = req.params.id;
      // ...
    });

    বনাম

    const pathToRegExp = require('path-to-regexp');
    
    function prepareParams(matches, pathKeys, previousParams) {
      var params = previousParams || {};
    
      // TODO: support repeating keys...
      matches.slice(1).forEach(function (segment, index) {
        let { name } = pathKeys[index];
        params[name] = segment;
      });
    
      return params;
    }
    
    const itemIdKeys = [];
    const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET') return next();
    
      var urlMatch = itemIdPattern.exec(req.url);
      if (!urlMatch) return next();
    
      if (itemIdKeys && itemIdKeys.length)
        req.params = prepareParams(urlMatch, itemIdKeys, req.params);
    
      let id = req.params.id;
      // ...
    });

দ্রষ্টব্য: এই বৈশিষ্ট্যগুলির এক্সপ্রেস 'বাস্তবায়ন তার অন্তর্ভুক্ত করা হয় Router, LayerএবংRoute


3
এম্বেড থাকা অ্যাপ্লিকেশন উল্লেখ করার জন্য কুডোস। এক্সপ্রেস মিডলওয়্যারগুলি সাজানোর এটি খুব সহজ উপায়।
wprl

4
এটি কি বলা যায় যে অ্যাপ.ইজেস.এপস, অ্যাপ.পোস্ট, অ্যাপ.পুট প্রতিটি বিপরীতে না করে সবকিছু করতে পারে?
এনজিঙ্গো

6
এখনও বুঝতে অসুবিধা।
Jeb50

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

2
আমি মনে করি এটি অত্যন্ত জেনে রাখা উচিত যে এই প্রতিক্রিয়াটি পুরানো এবং অপ্রচলিত, আমার মন্তব্যের তারিখ অনুসারে আপনার প্রয়োজন path-to-regexpবা আর কোনও প্রয়োজন নেই এবং আপনি useপদ্ধতির প্রথম যুক্তিতে সরাসরি রুট পরামিতি ব্যবহার করতে পারেন ।
vdegenne

50

app.use কানেক্ট থেকে "নিম্ন স্তরের" পদ্ধতিটি, মিডওয়্যার ফ্রেমওয়ার্ক যা এক্সপ্রেস নির্ভর করে।

এখানে আমার গাইডলাইন:

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

তবে যদি আমি পদ্ধতিটির বিষয়ে চিন্তা না করি তবে আমি app.useকয়েকটি রুট পরিচালনা করতে পারি ? বা app.useরাউটিংয়ের জন্য আমাদের কখনই ব্যবহার করা উচিত নয় ।
এলিমেন্টো 0

আপনি আপনার রুটগুলি পৃথক পৃথক পৃথক চিত্রগুলিতে সরিয়ে নিতে অ্যাপ.উস ব্যবহার করতে পারেন। users.js, عمارت.js
রব অ্যাঞ্জেলিয়র

1
যদিও এটির উপরে একটি উত্তর আরও অনেকগুলি ইউপি / কৃষি সংগ্রহ করেছে, আপনার উত্তরটি মিডলওয়্যার সহ পরিশীলিত জিনিসগুলিকে কয়েকটি সহজ শব্দের, কুডোতে অনুবাদ করে।
Jeb50

50

কেবল অ্যাপ.ইউজের অর্থ "এটিকে সমস্ত অনুরোধে চালান"
অ্যাপ্লিকেশনটির অর্থ "প্রদত্ত ইউআরএলের জন্য এটি একটি জিইটি অনুরোধে চালান"


এটা অত সস্তা না. অন্যান্য উত্তর পড়ুন।
ডেভিড লোপেজ

28

app.getযখন বলা হয় HTTP- র পদ্ধতি সেট করা হয় GET, যেহেতু app.useHTTP- র পদ্ধতির নির্বিশেষে বলা হয়, এবং সেইজন্য একটি স্তর যা সব অন্যান্য RESTful ধরনের উপরের যা দ্রুতগামী প্যাকেজ আপনি অ্যাক্সেস দেয় হয় সংজ্ঞায়িত করে।


19

app.useএবং এর মধ্যে পার্থক্য app.get:

app.use → এটি সাধারণত আপনার অ্যাপ্লিকেশনে মিডলওয়্যারগুলি প্রবর্তনের জন্য ব্যবহৃত হয় এবং সমস্ত প্রকারের এইচটিটিপি অনুরোধগুলি পরিচালনা করতে পারে।

app.get → এটি কেবল জিইটি এইচটিটিপি অনুরোধগুলি পরিচালনা করার জন্য।

এখন, app.use& এর মধ্যে একটি বিভ্রান্তি রয়েছে app.all। সন্দেহ নেই, তাদের মধ্যে একটি জিনিস প্রচলিত রয়েছে যে উভয়ই সব ধরণের এইচটিটিপি অনুরোধ পরিচালনা করতে পারে। তবে কিছু পার্থক্য রয়েছে যা আমাদের মিডলওয়্যারের জন্য অ্যাপ.উস এবং রুট হ্যান্ডলিংয়ের জন্য অ্যাপ্লিকেশন ব্যবহার করার পরামর্শ দেয়।

  1. app.use()→ এটিতে কেবল একটি কলব্যাক লাগে।
    app.all()→ এটি একাধিক কলব্যাক নিতে পারে।

  2. app.use()ইউআরএল নির্দিষ্ট পথ দিয়ে শুরু হয় কিনা তা কেবলমাত্র তা দেখতে পাবে।
    তবে, app.all()সম্পূর্ণ পথের সাথে মিলবে।

উদাহরণ স্বরূপ,

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/subject
  1. next()কল ভিতরে app.use()পারেন পরবর্তী মিডলওয়্যার বা কোন রুট হ্যান্ডলার কল হবে, কিন্তু next()কল ভিতরে app.all()পরবর্তী রুট হ্যান্ডলার (ডাকা হবে app.all(), app.get/post/put...শুধুমাত্র ইত্যাদি)। এর পরে যদি কোনও মিডলওয়্যার থাকে তবে তা এড়িয়ে যাবে। সুতরাং, সব মিডলওয়্যারগুলি সর্বদা রুটের হ্যান্ডলারের উপরে রাখাই যুক্তিযুক্ত।

1
আপনার 3 পয়েন্টটি এক্সপ্রেস 4.16 এ প্রয়োগ করা হবে বলে মনে হচ্ছে না। উইলের next()ভিতরে কল করা app.all('/*', ...)আসলে app.use('/', ...)ফাইলটির পরে একটি সম্পাদন করে। আমি আপনাকে সেখানে ভুল বুঝেছি। অন্যথায় খুব সহায়ক ব্যাখ্যা।
বিটলজুইস


4

উপরোক্ত ব্যাখ্যাগুলি ছাড়াও, আমি যা অভিজ্ঞতা করি:

app.use('/book', handler);  

URL / 'book' দিয়ে শুরু হওয়া সমস্ত অনুরোধের সাথে মিলবে । সুতরাং এটি '/ বই / 1' বা '/ বই / 2' এর সাথেও মেলে

app.get('/book')  

নির্ভুল ম্যাচের সাথে কেবল জিইটি অনুরোধের সাথে মেলে । এটি '/ book / 1' বা '/ book / 2' এর মতো URL গুলি পরিচালনা করবে না

সুতরাং, আপনি যদি এমন কোনও গ্লোবাল হ্যান্ডলার চান যা আপনার সমস্ত রুট পরিচালনা করে, তবে app.use('/')বিকল্পটি। app.get('/')কেবলমাত্র মূল URL টি পরিচালনা করবে।

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