2012-10-03 22 views
5

मैंने यह किया है से पहले ... मैं क्या मैं गलत इस बार कर रहा हूँ का पालन नहीं करते अपरिभाषित, लेकिन मैं कुछ घंटों के लिए संघर्ष कर रहे हैं और अब अपने आप पर विचार मानसिक रूप से अवरुद्ध इसी कोड:NodeJS: एक्सप्रेस + RedisStore, req.session

app.use(express.bodyParser()); 
app.use(i18next.handle); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public')); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'swig'); 
app.set('view cache', false); 
var session_store = new RedisStore({ client : redis_client}); 
app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); 
app.use(express.cookieParser()); 
app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); 
app.use(app.router); 

फिर जब अनुरोधों को संभालने, यहाँ सिर्फ एक उदाहरण है: Redis को

app.get('/session_test', function (req, res, next) { 
    console.log(req.session); //undefined 
}); 

कनेक्शन ठीक काम कर रहा है। कोई त्रुटि नहीं दिखायी गयी है। फिर, अनुरोध से इसे एक्सेस करने का प्रयास करते समय, req.session अपरिभाषित है। ब्राउज़र सही सिड भेज रहा है।

मैं सटीक प्रवाह उस अनुरोध के दौरान होता है पर कोई विशेषज्ञ हूँ, लेकिन डिबगिंग के बाद, यह अगर रूटर सत्र मिडलवेयर से पहले कहा जा रहा था के रूप में लगता है। किसी भी के लिए पहले से

धन्यवाद और सभी संभावना मदद करते हैं। मैं कोई भी कोड प्रदान करूंगा जो मैं कर सकता हूं, मुझे यकीन है कि आपकी मदद का क्या हो सकता है।

यहां अधिक कोड है। server.js

//Dependency modules 
var express = require('express'), 
    app = express.createServer(), 
    //Application dependency modules 
    settings = require('./settings'), //app settings 
    routes = require('./routes'), //http routes 
    rtroutes = require('./rtroutes'); //real time communication routes (io) 

var io = require('socket.io').listen(app); 
var appWithSettings = settings.setup(io, app); 

routes.settings.setup(appWithSettings); 
rtroutes.settings.setup(io, appWithSettings); 

कोई मार्ग नहीं जोड़ रहे हैं जब तक routes.settings.setup कहा जाता है। सेटिंग्स (जो वैश्विक सेटिंग्स है) एक बहुत बड़ी फाइल है। यही वह जगह है जहां सभी विन्यास किया जाता है। सेटिंग तब तक नहीं जोड़े जाते हैं जब तक सेटिंग्स.सेटअप विधि भी नहीं कहा जाता है।

//Dependency modules 
var express = require('express'), 
    redis = require('redis'), 
//Important configuration values 
var SESSION_SECRET = 'some secret thing which doesnt belong to stackoverflow!', 
    insert_other_variables_here = "lalala"; 

//Computed general objects 

var RedisStore = require('connect-redis')(express), 
    redis_client = redis.createClient(REDIS_PORT, REDIS_HOST); 

exports.setup = function (io, app) { 
    app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(i18next.handle); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/public')); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'swig'); 
    app.set('view cache', false); 
    var session_store = new RedisStore({ client : redis_client}); 
    app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); 
    app.use(express.cookieParser()); 
    console.log("ABOUT TO ADD SESSION STORE MIDDLEWARE"); 
    app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); 
    console.log("AND NOW ADDED THE SESSION STORE MIDDLEWARE"); 
    app.use(app.router); 
    }); 

    app.configure('development', function() { 
    //some things in here, but nothing that affects app. I have commented this 
    //for debugging and it changed nothing 
    }); 

    app.configure('production', function() { 
    //mostly configuration for io and some caching layers, as well as servers info 
    app.use(express.errorHandler()); 
    app.use(express.logger({ stream : logFile })); 
    }); 
    app.listen(WEB_PORT); 
    return { 
    app : app, 
    //some other stuff that isn't relevant 
    } 
} 

मैं 25 मार्गों 4 अलग फ़ाइलें (किसी भी तरह मैं अब तक के सत्र के लिए एक की जरूरत नहीं है में विभाजित किया है, के बाद से मैं कुछ भागों में देरी किया गया था और सब कुछ की जरूरत नेवला साथ किया गया था: यहाँ फ़ाइल का एक हिस्सा है)। यह इस प्रकार से किया जा रहा है का एक उदाहरण (फर्जी नाम के साथ):

मार्गों/index.js

export.settings = require("./settings"); 

मार्गों/settings.js

exports.setup = function (app_settings) { 
    require("./route1")(app_settings); 
    require("./route2")(app_settings); 
    require("./route3")(app_settings); 
}; 

यहाँ एक बाहर छीन लिया "route1" है फ़ाइल ("मार्गों/route1.js"):

module.exports = function (app_settings) { 
    var app = app_settings.app; 
    console.log("ABOUT TO ADD ROUTES") 
    app.get("/signin", function (req, res, next) { 
    console.log(req.session); //this will be undefined 
    }); 
    app.get("/register", function (req, res, next) { 
    }); 
    app.get('/language', function (req, res, next) { 
    }); 
    app.post('/settings', function (req, res, next) { 
    }); 
    console.log("ADDED ROUTES NOW!") 
} 
+0

सो आप इस पंक्ति में वहाँ दो बार राशि प्रयास करना चाहिए: app.use (express.session ({दुकान: session_store, रहस्य: SESSION_SECRET, कुंजी: "sid"})); – chovy

+0

मेरा बुरा, मैंने दो बार कोड चिपकाया (सभी लाइनें वहां दो बार थीं) – Mamsaac

+0

क्या इससे समस्या ठीक हुई? मैं नहीं देखता कि आप req का उपयोग कहां कर रहे हैं।सत्र – chovy

उत्तर

9

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

+0

हां। यह एक विचार है कि मेरे दिमाग को घुमाया गया ... इसलिए मैंने सत्र मध्यवर्ती जोड़ने से पहले और बाद में कंसोल.लॉग रखा, और मार्ग जोड़ने से पहले और बाद में आउटपुट सत्र के लिए पहले आता है (लेकिन जोड़ने से पहले और बाद में) और फिर मार्गों के लिए । क्या यह संभव है कि मिडलवेयर ऑर्डर मेरी कुछ क्रियाओं से रीसेट हो जाए? – Mamsaac

+0

आप 'राउटर' के आवेषण के बाद 'स्थिर' के अपने आमंत्रण को स्थानांतरित करने का प्रयास कर सकते हैं। मैं 'i18next' से परिचित नहीं हूं इसलिए मुझे नहीं पता कि इससे समस्या हो सकती है या नहीं। आप स्टैक के अंत में 'errorhandler' को स्थानांतरित करने का भी प्रयास कर सकते हैं; यह संभव है कि अब यह कहां है, इसमें 'सत्र' में उत्पन्न एक त्रुटि गुम है। – ebohlman

+0

मैंने इसे ठीक किए बिना i18next और errorhandler पर टिप्पणी की। मैं app.router के नीचे स्थैतिक स्थानांतरित हुआ (नोटिस मैं उत्पादन के लिए स्थैतिक अक्षम करता हूं, क्योंकि मैं इसके लिए nginx का उपयोग करता हूं) और अभी भी मदद नहीं की है। मुझे अभी भी लगता है कि आप सही रास्ते पर हैं, लेकिन मुझे यकीन नहीं है कि मैं कहां खराब हुआ :( – Mamsaac

3

इस अद्यतन करने के लिए भूल: Ebohlman मुझे सही रास्ते में निर्धारित किया है।

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

मैं और अधिक v.v