2013-03-08 7 views
13

मैं समझने की कोशिश कर रहा हूं कि निम्न में से प्रत्येक का उपयोग करना सबसे अच्छा है। यहां मेरी प्राथमिक समझ है:Express.js: app.locals बनाम req.locals बनाम req.session

app.locals - ऐप स्तर पर वैश्विक चर संग्रहीत करने के लिए अच्छा है। सभी उपयोगकर्ता/सत्र इन चर के लिए समान मान देखेंगे। चर सभी विचारों के लिए उपलब्ध हैं।

res.locals - विशिष्ट अनुरोध/प्रतिक्रिया चक्र के लिए चर भंडारण के लिए अच्छा है। चर केवल प्रतिक्रिया से जुड़े दृश्य के लिए उपलब्ध हैं।

req.session - अद्वितीय उपयोगकर्ता सत्र (उदा।, उपयोगकर्ता नाम) से जुड़े चर को संग्रहीत करने के लिए अच्छा है। ये चर अद्वितीय उपयोगकर्ता/सत्र के लिए सभी विचारों के लिए उपलब्ध होना चाहिए।

मेरे पास विशिष्ट उपयोग केस निम्नानुसार है: कोई उपयोगकर्ता क्वेरी चलाता है जो mongodb से डेटा पुनर्प्राप्त करता है। अब मैं इस क्वेरी का परिणाम चाहता हूं, जो एक जेसन सरणी है, जो सभी दृश्यों (http अनुरोध) के चर के रूप में उपलब्ध है। परिणाम सरणी को "स्टोर" करने का सबसे अच्छा तरीका क्या है ताकि प्रत्येक दृश्य इसे एक्सेस कर सके?

धन्यवाद

+0

आपने बहुत अधिक सवाल स्वयं जवाब दिया। req.locals डेटा के लिए है जो वर्तमान अनुरोध के विचारों में उपलब्ध होना चाहिए। –

+4

'res.locals' है, 'req.locals' – Daniel

उत्तर

4

मैं अब इस क्वेरी, जो एक json सरणी है, विचारों के सभी के लिए एक चर के रूप में उपलब्ध का परिणाम चाहते हैं। परिणाम सरणी को "स्टोर" करने का सबसे अच्छा तरीका क्या है ताकि प्रत्येक दृश्य इसे एक्सेस कर सके?

जब आप "सभी विचारों के लिए उपलब्ध" कहते हैं, तो मुझे लगता है कि आप सभी HTTP अनुरोधों में आपका मतलब है। यदि ऐसा है तो आपको अवगत होना चाहिए कि HTTP एक स्टेटलेस प्रोटोकॉल है और इसके लिए प्रदान नहीं करता है। इसके लिए आपको अपना खुद का तंत्र विकसित करना होगा।

ऐसा करने का एक तरीका सर्वर पर इस जानकारी (सरणी) को कैश करके और प्रत्येक अनुरोध पर इसे पुनर्प्राप्त करके (उदाहरण के लिए, इसे मोंगोडीबी की बजाय स्मृति से पुनर्प्राप्त करें)। आप कुकी पर एक सत्र आईडी स्टोर करेंगे और इस आईडी के आधार पर इसे अन्य कैश के माध्यम से कैश से लाएगा। कई कैश टूल उपलब्ध हैं (उदा। रेडिस, मेमकैच, एट कैटेरा) जिन्हें आप स्मृति में जानकारी को स्टोर करने के लिए चुन सकते हैं।

आप भी इस जानकारी (सरणी ही) जिस स्थिति में यह हर HTTP अनुरोध पर आगे और पीछे क्लाइंट और सर्वर के बीच भेज दिया जाएगा और बहुत संभावना एक बहुत अच्छा विचार नहीं किया जाएगा कुकी सकता है जब तक कि डेटा है बहुत छोटा।

+1

यदि आप' app.locals' में डेटा संग्रहीत करते हैं, और एक से अधिक नोड प्रक्रिया (यानी आप 'क्लस्टर' का उपयोग नहीं करते हैं) नहीं चलाते हैं, तो यह अनुरोधों पर भी, सभी विचारों के लिए उपलब्ध होगा। – robertklep

+0

@robertklep - यही वह है जो मैंने मूल रूप से किया था, ऐप.लोकल्स में डेटा संग्रहीत किया था, लेकिन फिर मैंने HTTP अनुरोधों के दो पीसी के साथ परीक्षण चलाया और दोनों ने एक ही डेटा देखा! मैं ग्राहकों के बीच डेटा साझा नहीं करना चाहता हूं। –

+2

तो आप उन्हें सभी विचारों में उपलब्ध करना चाहते हैं, लेकिन केवल उस उपयोगकर्ता के लिए जो क्वेरी को ट्रिगर करता है? 'Req.session' का उपयोग करें (फिर से, आपके प्रश्न में आप पहले ही जवाब दे रहे हैं ;-) – robertklep

संबंधित मुद्दे