এক্সপ্রেস.জেএস-তে পরবর্তী () ব্যবহার করে পরবর্তী মিডলওয়্যারের কাছে ভেরিয়েবলগুলি পাস করা


200

ঠিক আছে, আমার প্রশ্নটি হ'ল আমি প্রথম মিডওয়্যার থেকে অন্য মিডলওয়্যারের কাছে কিছু পরিবর্তনশীলটি পাস করতে চাই এবং আমি এটি করার চেষ্টা করেছি, তবে সেখানে " req.somevariableঅপরিজ্ঞাত" হিসাবে দেওয়া হয়েছে "।


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...

কাজ করা উচিত. যদি না প্রশ্নটিতে এটি টাইপ না করা হয় আপনি সম্ভবত ব্যর্থ হন কারণ আপনি resমিডলওয়্যার 1 এ মানটি নির্ধারণ করেন এবং মিডওয়্যার 2 থেকে এটি পাওয়ার চেষ্টা করছেন req
Andreas Hultgren

থ্যাঙ্কস @ অ্যান্ড্রেসহল্টগ্রেন
ব্যবহারকারী 2791897

Local variables are available in middleware via req.app.locals expressjs.com/pt-br/api.html#app.locals
রনি রয়স্টন

উত্তর:


202

আপনার ভেরিয়েবলটিকে reqবস্তুর সাথে সংযুক্ত করুন , নাres

পরিবর্তে

res.somevariable = variable1;

আছে:

req.somevariable = variable1;

অন্যরা যেমন উল্লেখ করেছে, res.localsমিডলওয়্যারের মাধ্যমে ডেটা পাস করার প্রস্তাব দেওয়া উপায়।


13
res.locals.variable = var ব্যবহার করুন; অন্য উত্তরটি দেখুন
Godzsa

1
পরিবর্তনশীলটি পুনরুদ্ধার করতে, পরবর্তী মিডলওয়্যার ফাংশনে req.res.locals.variable ব্যবহার করুন
উইলিয়াম উ

3
@ উইলিয়ামউইউ এটির res.locals, না req.res.locals
cchamberlain

2
res.locals.myVarযাবার উপায়
জেসোসেমিনারা

446

এই কি res.locals বস্তুর জন্য নয়। অনুরোধ অবজেক্টে সরাসরি ভেরিয়েবল সেট করা সমর্থিত বা ডকুমেন্টেড নয়। res.locals একটি অনুরোধ জীবন জুড়ে রাষ্ট্র রাখা গ্যারান্টিযুক্ত।

res.locals

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

এই সম্পত্তি অনুরোধ-স্তরের তথ্য যেমন অনুরোধের পাথের নাম, প্রমাণীকরণকারীর ব্যবহারকারী, ব্যবহারকারীর সেটিংস ইত্যাদির বহিঃপ্রকাশের জন্য দরকারী।

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

পরবর্তী মিডলওয়্যারের মধ্যে পরিবর্তনশীলটি পুনরুদ্ধার করতে:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});

66
জানি না কেন এই গৃহীত উত্তর না, এই নথিভুক্ত একটি অনুরোধ সর্বত্র মিডলওয়্যার থেকে সেট ভেরিয়েবল উপায়।
স্যাম হোমস

11
অনুরোধের জীবনকালীন সময়ে অবশেষে রেন্ডার করা হয়েছে এমন দর্শনগুলি দ্বারা পুনর্নির্মাণের জন্য ব্যবহার করা হবে , যা ডকুমেন্টেশন বলছে। আপনি মতামত ব্যবহার না করেন তাহলে এটা স্থানীয়দের বস্তুর উপর কিছু করা Overkill এবং এটি হল না কনভেনশন। এই ক্ষেত্রে, আমি লোকদের সম্মেলনের সাথে লেগে থাকতে উত্সাহিত করি যাতে এক্সপ্রেস বা লাইফসাইকেলের অনুরোধের মত ধারণাগুলি শিখার সময় আমরা জ্ঞানীয় বোঝা হ্রাস করতে পারি।
রিয়েল_সেট

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

14
উপর মিডলওয়্যার সেট ভেরিয়েবল লেখার জন্য দ্রুতগামী ডকুমেন্টেশন reqবস্তুর expressjs.com/en/guide/writing-middleware.html । বিভাগটি দেখুনMiddleware function requestTime
ক্যাটফিশ

2
@ বেগুনিফাই ভাগ্যক্রমে সাড়া ফেলে না যে প্রতিক্রিয়া কীভাবে কাজ করে। প্রত্যুত্তর যেমন প্রতিক্রিয়া বস্তুর একটি কার্মিক সম্পত্তি কল করে প্রেরিত হয় res.json({}), ইত্যাদি res.localsঅনুরোধ জীবনের উপর ব্যাক এন্ড উপর শুধুমাত্র উপলব্ধ। expressjs.com/en/5x/api.html
চেম্বারলাইন

22

আমি মনে করি না যে সেরা অনুশীলনটি একটি ভেরিয়েবল পাস করবে req.YOUR_VAR। আপনি বিবেচনা করতে পারেন req.YOUR_APP_NAME.YOUR_VARবা req.mw_params.YOUR_VAR

এটি আপনাকে অন্যান্য বৈশিষ্ট্যগুলিকে ওভাররাইট করা এড়াতে সহায়তা করবে।

আপডেট 31 মে, 2020

res.locals আপনি যা খুঁজছেন তা হ'ল , অনুরোধটি অবজেক্টটিকে স্কুপ করা হবে।

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

এই সম্পত্তি অনুরোধ-স্তরের তথ্য যেমন অনুরোধের পাথের নাম, প্রমাণীকরণকারীর ব্যবহারকারী, ব্যবহারকারীর সেটিংস ইত্যাদির বহিঃপ্রকাশের জন্য দরকারী।


2
আপনি কিভাবে req.YOUR_APP_NAME = {}প্রাথমিকভাবে সেট করার পরামর্শ দিচ্ছেন ? আপনি কেবল লিখতে চেষ্টা করুন আপনি req.YOUR_APP_NAME.someVarএকটি ত্রুটি পাবেন req.YOUR_APP_NAMEযা এখনও সংজ্ঞায়িত হয়নি।
কাউশা

2
@ কুশা আপনি আপনার রাউটিং স্ক্রিপ্টের শীর্ষে রাউটার মিডলওয়্যার লিখতে পারেন:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
টমাস

পরের () ফাংশনটি দিয়ে পারম হিসাবে পাস করার কোনও উপায় আছে? পরের মতো (মায়োবজ)
ফিল্স_এক্স

1
@ কুশা - আপনার অপরিজ্ঞাত ত্রুটির প্রকাশের সাথে কিছুই করার নেই, এটি আপনি কোনও অস্তিত্বের জন্য কোনও সম্পত্তি বরাদ্দ দেওয়ার চেষ্টা করছেন। সাধারণত এটি করতে আপনি ব্যবহার করবেন req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'
চেম্বারলাইন

1
@ ফিলাক্স_এক্স, যদি আপনি কোনও প্যারামিটার nextফাংশনে পাস করেন তবে এটি এক্সপ্রেস 'ত্রুটি হ্যান্ডলারটিকে ট্রিগার করবে এবং ছাড়বে । দস্তাবেজগুলি পরীক্ষা করুন।
মার্ল

7

এটি কারণ reqএবংres দুটি পৃথক বস্তু।

আপনি যে জিনিসটিতে এটি যুক্ত করেছেন সেই একই জিনিসটির জন্য আপনাকে সম্পত্তিটি সন্ধান করতে হবে।


3

কৌশলটি বেশ সহজ ... অনুরোধ চক্রটি এখনও বেশ বেঁচে আছে। আপনি কেবলমাত্র একটি নতুন ভেরিয়েবল যুক্ত করতে পারেন যা একটি অস্থায়ী, কলিং তৈরি করবে

app.get('some/url/endpoint', middleware1, middleware2);

যেহেতু আপনি প্রথম মিডওয়্যারটিতে আপনার অনুরোধটি পরিচালনা করতে পারেন

(req, res, next) => {
    var yourvalue = anyvalue
}

মিডলওয়্যার 1 এ আপনি আপনার যুক্তিটি পরিচালনা করেন এবং নীচের মত আপনার মানটি সংরক্ষণ করেন:

req.anyvariable = yourvalue

মিডলওয়্যার 2 এ আপনি মিডলওয়্যার 1 থেকে নিম্নলিখিতটি করে এই মানটি ধরতে পারেন:

(req, res, next) => {
    var storedvalue = req.yourvalue
}

1

উপরে উল্লিখিত হিসাবে, res.locals এটি করার একটি ভাল (প্রস্তাবিত) উপায়। এক্সপ্রেসে কীভাবে এটি করা যায় তার জন্য একটি টিউটোরিয়াল জন্য এখানে দেখুন ।

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