পরবর্তী ফাংশন প্রকাশ, এটি আসলে কি জন্য?


124

next()পদ্ধতিটি কী করে তার একটি ভাল বিবরণ সন্ধান করার চেষ্টা করা হয়েছে । এক্সপ্রেস ডকুমেন্টেশনে এটি বলেছে যে next('route')সেই রুটে ঝাঁপিয়ে পড়তে এবং সমস্ত রুটকে মাঝখানে এড়িয়ে যেতে ব্যবহার করা যেতে পারে তবে কখনও কখনও nextযুক্তি ছাড়াই ডাকা হয়। nextফাংশনটি বর্ণনা করে এমন কোনও ভাল টিউটোরিয়াল ইত্যাদি সম্পর্কে কেউ জানেন ?

উত্তর:


160

next()কোনও যুক্তি না দিয়ে "কেবল মজা করছি, আমি আসলে এটি পরিচালনা করতে চাই না" says এটি আবার ফিরে যায় এবং মেলে যে পরবর্তী রুটটি খুঁজে পেতে চেষ্টা করে।

এটি দরকারী, যদি আপনি ইউআরএল স্লাগগুলি সহ আরও অনেক কিছু পৃষ্ঠা পরিচালক থাকতে চান তবে বলুন, তবে এখানে একটি উদাহরণ।

app.get('/:pageslug', function(req, res, next){
  var page = db.findPage(req.params.pageslug);
  if (page) {
    res.send(page.body);
  } else {
    next();
  }
});

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

এই আপ কোডটি নির্দিষ্ট আইডি স্লাগ সহ একটি পৃষ্ঠার জন্য একটি ডাটাবেস চেক করা উচিত। এটি যদি একটি খুঁজে পেতে এটি রেন্ডার! যদি এটির সন্ধান না করে তবে এই রুট হ্যান্ডলারটিকে উপেক্ষা করুন এবং অন্যগুলির জন্য দেখুন।

সুতরাং next()কোনও যুক্তি ছাড়াই আপনি রুটটি পরিচালনা করেননি এমন ভান করার অনুমতি দেয় যাতে পরিবর্তে অন্য কোনওটি এটি বাছাই করতে পারে।


বা সাথে একটি হিট কাউন্টার app.all('*')। যা আপনাকে কিছু ভাগ করা সেটআপ কোড কার্যকর করতে এবং তারপরে আরও সুনির্দিষ্ট কিছু করার জন্য অন্যান্য রুটে চলে যেতে অনুমতি দেয়।

app.all('*', function(req, res, next){
  myHitCounter.count += 1;
  next();
});

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

দুর্দান্ত উত্তর! আমি পরের কিছু অন্যান্য ব্যবহারও দেখেছি, যেমন পরবর্তী (ত্রুটি) এবং পরের ('রুট')। আপনি কি এখন এইগুলির উদ্দেশ্য, আপনি কখন কোনও ত্রুটি প্রচার করতে চান এবং কখন কোনও নির্দিষ্ট পথে যেতে চান?
আন্দ্রেস সেলেনওয়াল

8
@AndreasSelenwall next('route') সুনির্দিষ্ট app.VERB()এবং যখন কোনও রুটে একাধিক কলব্যাক থাকে তখন " অবশিষ্ট রুট কলব্যাক (গুলি) কে বাইপাস করে " next(err)ব্যবহার করা হয় যে কোনও " ত্রুটি মিডলওয়্যার " ( Eপোস্ট থেকে) এ যাওয়ার জন্য ব্যবহৃত হয় ।
জোনাথন লোনোস্কি

5
সম্মত। কেবল এই বাক্যাংশটির জন্য: "কেবল মজা করছি, আমি আসলে এটি পরিচালনা করতে চাই না" আপনি আমাকে বুঝতে চেয়েছিলেন যে আমি কী সন্ধান করছি। আমি অনেক অনুরূপ প্রশ্ন দেখেছি এবং এক বাক্যে সমাধান পেয়েছি found
পেড্রো ব্যারোস

8
next()কোনও যুক্তি ছাড়াই কল করা আসলে সিস্টেমটিকে "আমি এটি হ্যান্ডেল করতে চাই না" বলি না, এটি কেবলমাত্র সিস্টেমটিকে এইটি শেষ হওয়ার পরে বাকি মিডলওয়্যারের প্রক্রিয়া চালিয়ে যেতে বলে দেয়। এটি কল করার জন্য next()এটি ত্রুটির শর্ত নয় , এটি স্বাভাবিক প্রবাহের অংশ। আপনি যদি কল next()না করেন তবে অন্য কোনও রুটগুলি মোটেই প্রক্রিয়া করা হবে না।
d512

1
আমি আশা করি এই ওয়েবসাইটটিতে আরও উত্তরগুলি সাধারণ লোকের জন্য লেখা হয়েছিল ... 'পরবর্তী () কোনও যুক্তি না দিয়ে "কেবল মজা করছি, আমি আসলে এটি পরিচালনা করতে চাই না" - - পারফেক্ট ফর নুবস ... (@ ডি 512 এর একটি রয়েছে) তবে আরও ভাল ব্যাখ্যা)
ডকোদা

129

বেশিরভাগ ফ্রেমওয়ার্কগুলিতে আপনি একটি অনুরোধ পান এবং আপনি একটি প্রতিক্রিয়া ফিরিয়ে দিতে চান। নোড.জেএসএসের অসম্পূর্ণ প্রকৃতির কারণে আপনি যদি অল্প তুচ্ছ জিনিস করে থাকেন তবে নেস্টেড কল ব্যাক নিয়ে সমস্যা দেখা দেয়। কানেক্ট.জেএস (ভি 4.0 এর পূর্বে, এক্সপ্রেস.জেএস কানেক্ট.জেএস এর শীর্ষে একটি স্তর ছিল) থেকে এটি রক্ষা করার জন্য মিডলওয়্যার বলে যা 2, 3 বা 4 পরামিতি সহ একটি ফাংশন function

function (<err>, req, res, next) {}

আপনার এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটি এই ফাংশনগুলির একটি স্ট্যাক।

এখানে চিত্র বর্ণনা লিখুন

রাউটারটি বিশেষ, এটি মিডলওয়্যার যা আপনাকে নির্দিষ্ট url এর জন্য এক বা একাধিক মিডলওয়্যার চালাতে দেয় ute সুতরাং এটি একটি স্ট্যাকের ভিতরে একটি স্ট্যাক।

সুতরাং পরবর্তী কি করে? সহজ, এটি আপনার অ্যাপ্লিকেশনটিকে পরবর্তী মিডওয়্যারটি চালানোর জন্য বলে। কিন্তু আপনি যখন কিছু পাস করেন তখন কি হয়? এক্সপ্রেস বর্তমান স্ট্যাকটি বাতিল করে দেবে এবং 4 টি পরামিতি রয়েছে এমন সমস্ত মিডলওয়্যার চালাবে।

function (err, req, res, next) {}

এই মিডলওয়্যারটি কোনও ত্রুটি প্রক্রিয়া করতে ব্যবহৃত হয়। আমি নিম্নলিখিত করতে পছন্দ:

next({ type: 'database', error: 'datacenter blew up' });

এই ত্রুটির সাথে আমি সম্ভবত ব্যবহারকারীকে কিছু ভুল হয়ে গেছে এবং আসল ত্রুটিটি লগ করব।

function (err, req, res, next) {
   if (err.type === 'database') {
     res.send('Something went wrong user');
     console.log(err.error);
   }
};

আপনি যদি আপনার এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটিকে স্ট্যাক হিসাবে চিত্রিত করেন তবে আপনি সম্ভবত অনেকগুলি উদ্ভটতা ঠিক করতে সক্ষম হবেন। উদাহরণস্বরূপ আপনি যখন রাউটারের পরে আপনার কুকি মিডলওয়্যার যুক্ত করেন তখন বোঝা যায় যে আপনার রুটে কুকি নেই।


3
আপনি এই বেনামে লগিং ফাংশনটি কোথায় সঞ্চয় করবেন?
dennismonsewicz

"এক্সপ্রেস বর্তমান স্ট্যাকটি বাতিল করে দেবে এবং 4 টি পরামিতি রয়েছে এমন সমস্ত মিডলওয়্যার চালাবে" " আমি ভাবছিলাম কীভাবে এক্সপ্রেস সঠিক ত্রুটি হ্যান্ডলার মিডলওয়্যারগুলি চালাতে সক্ষম। ধন্যবাদ!
অভিষেক আগরওয়াল

75

আইএমএইচও, এই প্রশ্নের গৃহীত উত্তর সত্যই সঠিক নয়। অন্যরা যেমন বলেছে, চেইনের পরবর্তী হ্যান্ডলারটি চালানো হয় তখন এটি নিয়ন্ত্রণ করার বিষয়ে। তবে আমি এটিকে আরও কংক্রিট করার জন্য আরও কিছু কোড সরবরাহ করতে চেয়েছিলাম। বলুন আপনার কাছে এই সাধারণ এক্সপ্রেস অ্যাপ রয়েছে:

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

app.get('/user/:id', function (req, res, next) {
    console.log('before request handler');
    next();
});

app.get('/user/:id', function (req, res, next) {
    console.log('handling request');
    res.sendStatus(200);
    next();
});

app.get('/user/:id', function (req, res, next) {
    console.log('after request handler');
    next();
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!')
});

যদি তুমি করো

curl http://localhost:3000/user/123

আপনি কনসোলে এই মুদ্রিত দেখতে পাবেন:

before request handler
handling request
after request handler

এখন আপনি যদি next()মিডল হ্যান্ডেলারটিতে কলটির মত মন্তব্য করেন :

app.get('/user/:id', function (req, res, next) {
    console.log('handling request');
    res.sendStatus(200);
    //next();
});

কনসোলে আপনি এটি দেখতে পাবেন:

before request handler
handling request

লক্ষ্য করুন যে শেষ হ্যান্ডলারটি (যেটি মুদ্রণ করে after request handler ) চালিত হয় না। এর কারণ আপনি পরবর্তী হ্যান্ডলারটি চালানোর জন্য এক্সপ্রেসকে আর বলছেন না।

সুতরাং আপনার "প্রধান" হ্যান্ডলারটি (যে 200 ফেরত দেয়) সফল হয়েছিল কিনা তা আসলেই কিছু যায় আসে না, আপনি যদি মিডলওয়্যারের বাকী অংশগুলি চালাতে চান তবে আপনাকে কল করতে হবে next()

এটি কখন কাজে আসবে? আসুন আমরা যে অনুরোধটি সফল হয়েছে কিনা তা বিবেচনা না করেই কোনও কোনও ডাটাবেসে আগত সমস্ত অনুরোধগুলি লগ করতে চান।

app.get('/user/:id', function (req, res, next) {
    try {
       // ...
    }
    catch (ex) {
       // ...
    }
    finally {
       // go to the next handler regardless of what happened in this one
       next();
    }
});

app.get('/user/:id', function (req, res, next) {
    logToDatabase(req);
    next();
});

আপনি যদি দ্বিতীয় হ্যান্ডলারটি চালাতে চান তবে আপনাকে next()প্রথম হ্যান্ডলারে কল করতে হবে ।

মনে রাখবেন নোড অ্যাসিঙ্ক তাই প্রথম হ্যান্ডলারের কলব্যাক কখন শেষ হবে তা তা জানতে পারে না। আপনাকে ফোন করে বলতে হবে next()


সোনফার আমার পক্ষে সেরা উত্তর।
নড়াইয়ের huুকাস্যান

ভাল ব্যাখ্যা!
চ্যাং

7

পরবর্তী () প্যারামিটার ছাড়াই পরবর্তী রুট হ্যান্ডলার বা ফ্রেমওয়ার্কে পরবর্তী মিডলওয়্যারটিকে ডাকে।


2
বা পরবর্তী মিডওয়্যার।
রবার্টক্লেপ

1

এর সহজ অর্থ পরবর্তী হ্যান্ডলারের কাছে পাস নিয়ন্ত্রণ।

চিয়ার্স


1

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


0

পরবর্তী ('রুট') এর ব্যবহার সম্পর্কেও প্রশ্ন জিজ্ঞাসা করা হয়েছে যা এ পর্যন্ত সরবরাহ করা উত্তরে সপ্তাহে আবৃত বলে মনে হচ্ছে:

  1. পরবর্তী () এর ব্যবহার:

সংক্ষেপে: পরবর্তী মিডলওয়্যার ফাংশন।

এই অফিসিয়াল এক্সপ্রেস জেএস ডকুমেন্টেশন - 'রাইটিং-মিডলওয়্যার' পৃষ্ঠা থেকে নিষ্কাশন করুন :

"মিডলওয়্যার ফাংশন মাইলোগার কেবল একটি বার্তা মুদ্রণ করে, তারপরে অনুরোধটি স্ট্যাকের পরবর্তী মিডওয়্যার ফাংশনে অনুরোধ করে পরবর্তী () ফাংশনটি কল করে" "

var express = require('express')
var app = express()

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

app.use(myLogger)

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

app.listen(3000)

এক্সপ্রেস জেএস ডকুমেন্টেশনের এই পৃষ্ঠাটিতে বলা হয়েছে "যদি বর্তমান মিডলওয়্যার ফাংশনটি অনুরোধ-প্রতিক্রিয়া চক্রটি শেষ না করে, তবে পরবর্তী মিডলওয়্যার ফাংশনে নিয়ন্ত্রণ পাস করার জন্য এটি অবশ্যই পরবর্তী () কল করতে হবে Otherwise নইলে অনুরোধটি ঝুলিয়ে রাখা হবে।"

  1. পরবর্তী ('রুট') এর ব্যবহার:

সংক্ষেপে: পরের রুট (বনাম পরের মিডলওয়্যার ফাংশন) পরবর্তী () )

এই এক্সপ্রেস জেএস ডকুমেন্টেশন থেকে নিষ্কাশন করুন - 'ব্যবহার করে-মিডলওয়্যার' পৃষ্ঠা :

"রাউটার মিডলওয়্যার স্ট্যাক থেকে মিডলওয়্যারের বাকী কাজগুলি বাদ দিতে, পরবর্তী রুটে নিয়ন্ত্রণ করার জন্য পরবর্তী ('রুট') কল করুন NOT দ্রষ্টব্য: পরবর্তী ('রুট') কেবলমাত্র মিডলওয়্যার ফাংশনগুলিতে কাজ করবে যা ব্যবহার করে লোড করা হয়েছিল app.METHOD () বা রাউটার.METHOD () ফাংশন।

এই উদাহরণটি একটি মিডলওয়্যার সাব-স্ট্যাক দেখায় যা / ব্যবহারকারী /: আইডি পথে জিইটি অনুরোধগুলি পরিচালনা করে ""

app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // render a regular page
  res.render('regular')
})

// handler for the /user/:id path, which renders a special page
app.get('/user/:id', function (req, res, next) {
  res.render('special')
})

0

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

app.get ('/', (req, res, next) => {পরের (););

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

পরবর্তী () একাধিক মিডলওয়্যার ফাংশন যখন অ্যাপ.ইউজ বা অ্যাপ্লিকেশনটিতে পাঠানো হয় তখন প্রতিটি মিডলওয়্যার ফাংশনটির মধ্যে fn ডেকে আনা প্রয়োজন, অন্যথায় পরবর্তী মিডওয়্যারের ফাংশনটি কল করা হবে না (যদি 1 টিরও বেশি মিডলওয়্যার ফাংশন পাস হয়)। বাকি মিডলওয়্যার ফাংশনগুলি কল করা এড়াতে মিডলওয়্যার ফাংশনের মধ্যে পরবর্তী ('রুট') কল করুন যার পরে অন্য কোনও মিডলওয়্যার ফাংশন কল করা উচিত নয়। নীচের কোডে, fn1 কল করা হবে এবং fn2 এছাড়াও কল করা হবে, যেহেতু পরবর্তী () fn1 মধ্যে কল করা হয়। তবে, fn3 কল করা হবে না, যেহেতু পরের ('রুট') কে fn2 এর মধ্যে ডাকা হবে।

app.get('/fetch', function fn1(req, res, next)  {
console.log("First middleware function called"); 
    next();
}, 
function fn2(req, res, next) {
    console.log("Second middleware function called"); 
    next("route");
}, 
function fn3(req, res, next) {
    console.log("Third middleware function will not be called"); 
    next();
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.