2012-06-11 15 views
10

डेटा के लिए जो केवल एक व्यक्तिगत अनुरोध के दौरान उपलब्ध होने की आवश्यकता है, इसे कहां रखा जाना चाहिए? मैं req और res ऑब्जेक्ट्स पर नई गुण बना रहा हूं इसलिए मुझे उस डेटा को फ़ंक्शन से फ़ंक्शन तक पास नहीं करना पड़ेगा।मैं node.js में अनुरोध-स्तरीय चर कैसे संग्रहीत करूं?

req.myNewValue = 'just for this request' 

प्रक्रिया ऑब्जेक्ट एक विकल्प है? या यह सभी अनुरोधों में वैश्विक रूप से साझा किया गया है?

उत्तर

11

आप चर यहाँ की तरह पारित कर के बारे में बात कर रहे हैं:

http.createServer(function (req, res) { 
    req.myNewValue = 'just for this request'; 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

तो यह बिल्कुल ठीक है तुम क्या कर रहे हैं। req अनुरोध डेटा संग्रहीत करता है, आप इसे जितना चाहें संशोधित कर सकते हैं। यदि आप एक्सप्रेस जैसे कुछ ढांचे का उपयोग कर रहे हैं, तो यह ठीक भी होना चाहिए (ध्यान रखें कि आप req ऑब्जेक्ट के कुछ अंतर्निहित गुणों को ओवरराइड कर सकते हैं)।

यदि "प्रक्रिया ऑब्जेक्ट" द्वारा आप वैश्विक चर process पर प्रतिक्रिया दे रहे हैं, तो बिल्कुल नहीं। यहां डेटा वैश्विक है और इसे बिल्कुल संशोधित नहीं किया जाना चाहिए।

+0

दरअसल में सहेजे गए डेटा का उपयोग कर सकते हैं, और यह एक आम मुहावरा है - उदाहरण के लिए (http [मार्ग मिडिलवेयर पर एक्सप्रेस डॉक्स] की जाँच : //expressjs.com/guide.html#route-middleware)। –

8

एक्सप्रेस 4 में, सर्वोत्तम अभ्यास res.locals पर अनुरोध स्तर चर को संग्रहीत करना है।

एक वस्तु है, जो प्रतिक्रिया स्थानीय चर अनुरोध के दायरे वाला है, और इसलिए केवल कि अनुरोध/प्रतिक्रिया चक्र (यदि हो तो) के दौरान प्रदान की गई दृश्य (ओं) के लिए उपलब्ध। अन्यथा, यह संपत्ति ऐप.लोकल्स के समान है।

यह संपत्ति अनुरोध पथ नाम, प्रमाणीकृत उपयोगकर्ता, उपयोगकर्ता सेटिंग्स आदि जैसे अनुरोध-स्तर की जानकारी को उजागर करने के लिए उपयोगी है।

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

process वस्तु सभी अनुरोधों द्वारा साझा किया जाता है और अनुरोध के अनुसार नहीं किया जाना चाहिए।

1

यदि आप एसिंक कॉलबैक में डेटा को संरक्षित करना चाहते हैं और वहां परिदृश्य हो सकते हैं, जहां अनुरोध और प्रतिक्रिया ऑब्जेक्ट उपलब्ध नहीं हैं। तो उस मामले में continuation-local-storage पैकेज, सहायक है।

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

यहाँ कैसे मैं इस

की स्थापना continuation-local-storage पैकेज

npm install continuation-local-storage --save 

नाम स्थान

let app = express(); 
let cls = require('continuation-local-storage'); 
let namespace = cls.createNamespace('com.domain'); 

बनाएं स्थापित करें तो मिडलवेयर है

app.use((req, res, next) => { 
    var namespace = cls.getNamespace('com.domain'); 
    // wrap the events from request and response 
    namespace.bindEmitter(req); 
    namespace.bindEmitter(res); 

    // run following middleware in the scope of the namespace we created 
    namespace.run(function() { 
     // set data on the namespace, makes it available for all continuations 
     namespace.set('data', "any_data"); 
     next(); 
    }); 
}) 
किसी भी फाइल में

अब या कार्य करते हैं तो आप इस नाम स्थान मिलता है और यह

//logger.ts 

var getNamespace = require("continuation-local-storage").getNamespace; 
let namespace = getNamespace("com.domain"); 
let data = namespace.get("data"); 
console.log("data : ", data); 
संबंधित मुद्दे