Express.js में अगले () का उपयोग करके अगले मिडलवेयर के लिए चर पासिंग


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 में मूल्य निर्दिष्ट करते हैं और इसे reqमिडलवेयर 2 से प्राप्त करने का प्रयास करते हैं ।
एंड्रियास हॉल्टग्रेन

Thankz @AndreasHultgren
user2791897

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 का उपयोग करें; अन्य उत्तर देखें
the बजे गोडज़सा

1
वैरिएबल को पुनः प्राप्त करने के लिए, अगले मिडलवेयर फंक्शन में req.res.locals.variable का उपयोग करें
विलियम वू

3
@WilliamWu इसके res.locals, नहीं req.res.locals
cchamberlain

2
res.locals.myVarजाने का रास्ता है।

447

यह वही है जो 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
res.locals का उपयोग उन विचारों द्वारा किया जाता है जो अंततः अनुरोध के जीवनचक्र के दौरान प्रदान किए जाते हैं, यह वही है जो प्रलेखन कह रहा है। यदि आप विचारों का उपयोग नहीं कर रहे हैं, तो यह स्थानीय वस्तुओं पर चीजों को डालने के लिए ओवरकिल है और यह सम्मेलन नहीं है। इन मामलों में, मैं लोगों को सम्मेलन के साथ रहने के लिए प्रोत्साहित करने के लिए प्रोत्साहित करता हूं ताकि हम एक्सप्रेस जैसी अवधारणाओं को सीखते हुए या जीवनचक्र का अनुरोध करते हुए संज्ञानात्मक भार को कम कर सकें।
real_ate

2
@real_ate, जो res.locals का प्राथमिक उपयोग है, हालाँकि यह OPs प्रश्न को संबोधित नहीं करता है। भविष्य के मिडलवेयर के लिए स्कोप किए गए चर को पास करने का अनुरोध कभी-कभी एक आवश्यकता होती है, जिस समय मैं यह आया हूं वह आमतौर पर शुरुआती मिडलवेयर में उपयोगकर्ता प्रमाणीकरण के आसपास होता है जो दावा करता है कि डाउनस्ट्रीम मिडलवेयर में रूट किया गया है।
cchamberlain

14
मिडलवेयर लिखने के लिए एक्सप्रेस डॉक्यूमेंट reqऑब्जेक्ट expressjs.com/en/guide/writing-middleware.html पर वैरिएबल सेट करता है । सेक्शन को देखेंMiddleware function requestTime
कैटफ़िश

2
@goonerify thats सौभाग्य से कैसे प्रतिक्रिया काम करता है। प्रतिक्रिया वस्तु के एक कार्यात्मक गुण जैसे कि कॉल के द्वारा प्रतिक्रियाएं प्रेषित की जाती हैं res.json({}), आदि res.locals, केवल अनुरोध के जीवन पर बैक-एंड पर उपलब्ध है। expressjs.com/en/5x/api.html
cchamberlain

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
@Kousha आप अपनी रूटिंग स्क्रिप्ट के शीर्ष पर राउटर मिडलवेयर लिख सकते हैं:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
टॉमस

वहाँ अगले () समारोह के साथ परम के रूप में इसे पारित करने के लिए एक रास्ता है? अगले की तरह (myObj)
philx_x

1
@ कूचा - आपकी अपरिभाषित त्रुटि का एक्सप्रेस से कोई लेना-देना नहीं है, इसके लिए आप किसी ऐसी संपत्ति को सौंपने की कोशिश कर रहे हैं जो मौजूद नहीं है। आमतौर पर ऐसा करने के लिए आप उपयोग करेंगे req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'
cchamberlain

1
@philx_x, यदि आप 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 ऐसा करने का एक अच्छा (अनुशंसित) तरीका है। एक्सप्रेस में यह करने के लिए एक त्वरित ट्यूटोरियल के लिए यहां देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.