2012-03-29 7 views
15

मैं node.js. में एक वेब ऐप लिख रहा हूं। अब सर्वर पर हर प्रसंस्करण हमेशा एक सत्र के संदर्भ में होता है जिसे अनुरोध को सर्वर पर हिट करते समय पहले चरण में पुनर्प्राप्त या बनाया जाता है। इसके बाद निष्पादन उनके भीतर कई मॉड्यूल और कॉलबैक के माध्यम से बहता है। मैं जिस प्रोग्रामिंग पैटर्न के साथ संघर्ष कर रहा हूं वह प्रोग्रामिंग पैटर्न बनाने में है ताकि कोड में किसी भी बिंदु पर सत्र ऑब्जेक्ट प्रोग्रामर के बिना उपलब्ध हो, जिसे प्रत्येक फंक्शन कॉल में तर्क के रूप में पास करने की आवश्यकता होती है।निष्पादन संदर्भ प्राप्त करने के लिए नोड.जेएस प्रोग्रामिंग पैटर्न

यदि सभी कोड एक ही फाइल में थे तो मुझे बंद हो सकता था, लेकिन यदि अन्य फाइलों में अन्य मॉड्यूल में फ़ंक्शन कॉल हैं तो मैं प्रोग्राम कैसे कर सकता हूं ताकि सत्र ऑब्जेक्ट इसे गुजरने के बिना कॉल किए गए फ़ंक्शन में उपलब्ध हो एक तर्क के रूप में। मुझे लगता है कि दो फाइलों में दो कार्यों के बीच कुछ लिंक होना चाहिए, लेकिन यह व्यवस्था कैसे करें जहां मैं फंस रहा हूं।

आम तौर पर मैं कहना चाहता हूं कि हमेशा एक निष्पादन संदर्भ होता है जो एक सत्र या नेटवर्क अनुरोध हो सकता है जिसका प्रसंस्करण कई फाइलों में फैलता है और निष्पादन संदर्भ वस्तु सभी बिंदुओं पर उपलब्ध कराई जानी चाहिए। वास्तव में कई उपयोग अनुरोध हो सकते हैं जैसे प्रत्येक नेटवर्क अनुरोध के लिए एक लॉग ऑब्जेक्ट या प्रति सत्र एक लॉग ऑब्जेक्ट। और इस काम को करने के लिए आवश्यक नलसाजी को प्रोग्राम प्रोग्रामर के बारे में परेशान किए बिना किनारे पर फिट होना चाहिए। वह सिर्फ जानता है कि निष्पादन संदर्भ सभी जगहों पर उपलब्ध है।

मुझे लगता है कि इसे हर किसी के सामने काफी आम समस्या का सामना करना चाहिए, तो कृपया मुझे कुछ विचार दें।

के बाद जब से तुम एक्सप्रेस का उपयोग कर रहे हैं समस्या

MainServer.js 


    app = require('express').createServer(); 
    app_module1 = require('AppModule1'); 
    var session = get_session(); 
    app.get('/my/page', app_module1.func1); 

AppModule1.js 

    app_module2 = require('AppModule2'); 
    exports.func1 = function(req,res){ 

    // I want to know which the session context this code is running for 

    app_module2.func2(req,res); 

    } 

AppModule2.js 

    exports.func2 = function(req,res){ 

    // I want to know where the session context in which this code is running 

    } 
+1

आप ऐसा करने के लिए एक तरह से पता लगा है, तो अपने ही सवाल का जवाब दें। –

उत्तर

8

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

यहाँ यह सेटअप एक्सप्रेस के साथ काम करने के लिए हो रही का एक उदाहरण है: How to use Node.js 0.8.x domains with express?

ध्यान दें कि में सामान्य कुछ हद तक प्रयोगात्मक और विशेष रूप से process.domain undocumented है डोमेन (हालांकि जाहिरा तौर पर 0.8 में दूर नहीं जा और वहाँ है इसे स्थायी बनाने पर कुछ चर्चा)। मैं उनकी सिफारिशों का पालन करने और process.domain.data पर एक ऐप-विशिष्ट संपत्ति जोड़ने का सुझाव देता हूं।

https://github.com/joyent/node/issues/3733

https://groups.google.com/d/msg/nodejs-dev/gBpJeQr0fWM/-y7fzzRMYBcJ

0

है, तो आप प्रत्येक अनुरोध से जुड़ी सत्र प्राप्त कर सकते हैं। कार्यान्वयन पीछा कर रहा है:

var express = require('express'); 
var app = express.createServer(); 
app.configure('development', function() { 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: 'foo', key: 'express.sid'})); 
}); 

तो हर अनुरोध पर, तो आप इस तरह सत्र पहुँच सकते हैं:

app.get('/your/path', function(req, res) { 
    console.log(req.session); 
}); 

मुझे लगता है, ताकि आप पता लगा सकते हैं कि हर सत्र के लिए अद्वितीय पहचानकर्ता के कुछ प्रकार है चाहता हूँ इसका संदर्भ सत्र आईडी 'express.sid' कुकी में पाया जा सकता है जिसे हम प्रत्येक सत्र के लिए सेट कर रहे हैं।

app.get('/your/path', function(req, res) { 
    console.log(req.cookies['express.sid']); 
}); 

तो मूल रूप से, आप कुछ और लेकिन कुकी पार्सर जोड़ सकते हैं और अपने एक्सप्रेस अनुप्रयोग के लिए सत्र को सक्षम और फिर जब तुम इन कार्यों को यह अनुरोध भेज, आप सत्र आईडी को पहचान सकते हैं की जरूरत नहीं है। आपको अनुरोध को पास करना होगा, हालांकि आप एक सिस्टम नहीं बना सकते हैं जहां यह सत्र को जानता है क्योंकि आप एक सर्वर लिख रहे हैं और सत्र अनुरोध पर उपलब्ध है।

+2

ठीक है आप निष्पादन संदर्भ डेटा को पास करने के लिए एक वाहक के रूप में req का उपयोग कर रहे हैं। यही वह नहीं है जिसे मैं ढूंढ रहा हूं। एक अधिक सामान्य स्तर पर, मैं पूरी तरह से कार्यों में तर्कों को प्रतिस्थापित करना चाहता हूं और फ़ाइलों में लगातार नाम रखना चाहता हूं, जब सही ऑब्जेक्ट पर अंक का उपयोग किया जाता है। तो अगर मैं फ़ाइलों में कहीं भी req.something कर रहा हूं, तो यह सही req ऑब्जेक्ट होगा क्योंकि यह – Raks

+0

पर स्वचालित रूप से पारित होता, ठीक है, इसके लिए पूरी प्रणाली लिखने के बजाय, आपको https://github.com/dwbutler/express का उपयोग करना चाहिए -ऑन-रेलवे – instinctious

+2

@ यहां रैक्स समस्या यह है कि आप प्रति-अनुरोध के साथ प्रति-फ़ाइल या वैश्विक की अवधारणा को भ्रमित कर रहे हैं। नोड में, और सामान्य रूप से घटना आधारित नेटवर्किंग में, अनुरोध संदर्भ है। अन्यथा, इस बात का अंतर करने का कोई तरीका नहीं है कि आप किस सत्र (कृत्रिम निर्माण) का संदर्भ दे रहे हैं और आपको दौड़ मिलती है। नोड न तो PHP और न ही रेल है, संपूर्ण दुभाषिया वैश्विक दायरे के रूप में अनुरोधों के बीच जीवित रहता है। –

0

क्या व्यक्त करता है, और node.js पर http stack के निर्माण के लिए सामान्य अभ्यास http middleware का उपयोग "बढ़ाने" या आपके सर्वर से कॉलबैक में आने वाले अनुरोध और प्रतिक्रिया ऑब्जेक्ट्स में कार्यक्षमता जोड़ने के लिए किया जाता है। यह बहुत सरल और सीधा-आगे है।

module.exports = function(req, res, next) { 
    req.session = require('my-session-lib'); 
    next(); 
}; 

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

AppModule2.js

exports.func2 = function(req,res){ 

    // I want to know where the session context in which this code is running 
    req.session; // <== right here 

} 
+3

आप ध्यान दें कि आप यहां अनुरोध और प्रतिक्रिया में गुजर रहे हैं। ओपी को हर मॉड्यूल में उस सामान को पारित करने की आवश्यकता नहीं थी। –

0

Nodetime एक रूपरेखा उपकरण है जो आंतरिक रूप से आप क्या करने की कोशिश कर रहे हैं क्या होता है।यह एक ऐसा फ़ंक्शन प्रदान करता है जो आपके कोड को इस तरह से नियंत्रित करता है कि किसी विशेष HTTP अनुरोध के परिणामस्वरूप कॉल उस अनुरोध से जुड़े होते हैं। उदाहरण के लिए, यह समझता है कि मोंगो, रेडिस या माईएसक्यूएल में कितना समय व्यतीत हुआ। यह देखने के लिए साइट पर वीडियो देखें कि मेरा क्या मतलब है http://vimeo.com/39524802

पुस्तकालय विभिन्न मॉड्यूल में जांच जोड़ता है। हालांकि, मैं यह देखने में सक्षम नहीं हूं कि उनके बीच संदर्भ (यूआरएल) कितना सटीक है। उम्मीद है कि कोई इसे समझ सकता है और स्पष्टीकरण पोस्ट कर सकता है।

संपादित करें: क्षमा करें, मुझे लगता है कि यह एक लाल हेरिंग था। नोडटाइम एक दूसरे के साथ कॉल को जोड़ने के लिए स्टैक ट्रेस का उपयोग कर रहा है। परिणाम जो प्रस्तुत करते हैं वे एक ही यूआरएल पर संभावित रूप से कई कॉलों में एकत्र होते हैं, इसलिए यह ओपी की समस्या का समाधान नहीं है।

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