2014-10-23 7 views
13

के बिना सहेज नहीं पाएंगे, मैं सत्र प्रबंधन के लिए नोड.जेएस, एक्सप्रेस और रेडिस का उपयोग कर एक वेबसाइट बना रहा हूं। किसी भी कारण से, यदि मेरे पास सत्र उदाहरण (isLoggedIn इस उदाहरण में है), और मैं पृष्ठ को रीफ्रेश करता हूं, तो वेरिएबल सहेजा नहीं जाता है, हालांकि, यदि मैं चर सेट करने के बाद req.session.save() पर कॉल करता हूं, तो यह Redis (redis) में सहेजा जाता है -cli मॉनीटर यह दिखाता है - save() पर कॉल नहीं करता है कि यह चर नहीं है, जबकि save() को कॉल करना) दिखाता है।सत्र node.js में req.session.save()

मैं इस का उपयोग कर रहा की स्थापना की और सर्वर शुरू करने के लिए:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var swig = require('swig'); 
var session = require('express-session') 
var RedisStore = require('connect-redis')(session); 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

// Configure the favicon first. This avoids other middleware from processing the request if we know the request is for the favicon. 
app.use(favicon(__dirname + '/public/images/favicon.ico')); 

// All other requests will require everything else. 

// Set up the view engine. 
app.set('view engine', 'html'); 
app.set('views', path.join(__dirname, '/views')); 
app.engine('html', swig.renderFile); 

// Set up our logger. 
app.use(logger('dev')); 

// Set up JSON parsing. 
app.use(bodyParser.json()); 

// Set up encoded URL parsing. 
app.use(bodyParser.urlencoded()); 

// Set up the cookie parser. 
app.use(cookieParser('thedogsleepsatnight')); 

// Set up our session store. This will use Redis as our session management. 
app.use(session({ 
    resave: true, 
    saveUninitialized: true, 
    secret: "thedogsleepsatnight", 
    store: new RedisStore() 
})); 

app.use(require('stylus').middleware(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 

और फिर, उस मार्ग में, मेरे पास है:

var express = require('express'); 
var router = express.Router(); 

router.get('/', function(req, res) { 
    console.log(req.session.isLoggedIn); 
    if (req.session.isLoggedIn) { 
     console.log("Logged in!"); 
    } else { 
     console.log("Not logged in"); 
    } 

    res.render('index'); 
}); 

router.post('/login', function(req, res) { 
    console.log("Going to set isLoggedIn. Currently: " + req.session.isLoggedIn); 
    req.session.isLoggedIn = true; 
    console.log("Set isLoggedIn. Currently: " + req.session.isLoggedIn); 
}); 

module.exports = router; 

कि से, मैं नेविगेट करने में सक्षम होना चाहिए /login पर, सत्र सेट को सत्य में लॉग इन किया गया है, और इसे स्वचालित रूप से Redis में सहेजना चाहिए। उसके बाद, / के लिए शीर्षक मुझे बताना चाहिए कि मैं में लॉग इन कर रहा हूँ। लोड हो रहा है /login चर सेट करता है, दूसरा लॉग कि दिखाता है, लेकिन लोड हो रहा है / का कहना है कि मैं में लॉग इन नहीं कर रहा हूँ। redis-CLI मॉनिटर

1414076171.241836 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}" 
से पता चलता , बचत जो isLoggedIn चर शामिल नहीं है, लेकिन req.session.save() शो में जोड़ने पर

:

1414076475.601644 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"isLoggedIn\":true}" 

कारण है कि मैं req.session.save() कॉल करनी होगी पर कोई विचार जब उदाहरण मैंने देखा है का उपयोग नहीं करते के सभी यह?

+0

क्या आप बताए गए उदाहरणों में से एक को इंगित कर सकते हैं? मुझे भंडारण में परिवर्तन को धक्का देने के लिए .save() का उपयोग करने की आवश्यकता होगी। –

+0

निश्चित रूप से, http://tipstak.blogspot.com/2014/01/session-management-example-using-redis-on-express.html। वह सहेजने के बिना userId सेट करता है। एक और एसओ सवाल में, http://stackoverflow.com/questions/14014446/how-to-save-and-retrieve- सत्र-from-redis, यह समझाया गया है कि इसे स्वचालित रूप से किया जाना चाहिए, जहां सेव() बस वहां है मैन्युअल बचत के लिए। – PuppyKevin

+0

क्या आपके द्वारा उपयोग किए जा रहे मिडलवेयर में कुछ भी है जो एक्सप्रेस-सत्र प्रॉक्सी को अंतिम विधि को रोक या तोड़ सकता है? https://github.com/expressjs/session/blob/master/index.js#L194 'res.render' उस विधि को निष्पादित करता है? –

उत्तर

59

ठीक है, तो, मैंने इसे समझ लिया है। मैं यहां किसी और के लिए जवाब दूंगा जो इस पर पकड़ा जाता है।

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

POST अनुरोधों के लिए (जो मैं उपयोग कर रहा हूं), हालांकि, वही धारणा नहीं बनाई गई है। सत्र राज्य केवल दो शर्तों में से एक में सहेजे जाते हैं - या तो जब डेटा भेजा जा रहा है (res.send, res.redirect, आदि के माध्यम से), या यदि आप मैन्युअल रूप से req.session.save() पर कॉल करते हैं। मैं पहले से ही एक AJAX अनुरोध से कॉल/लॉगिन कर रहा था, अगर कुछ शर्तों को पूरा किया गया तो मैं कुछ भी वापस नहीं कर रहा था। सत्र चर सेट करने के बाद सर्वर कुछ क्लाइंट के साथ क्लाइंट को प्रतिसाद दे रहा है।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद, मैं थोड़ी देर के लिए संघर्ष कर रहा हूं :) – Bardelman

+0

धन्यवाद आदमी, मैं लगभग पागल हो रहा है क्योंकि अनुरोध के दौरान मेरा सत्र नहीं बदला गया। तुम मेरा दिन बचाओ! –

+0

मेरा दिन बचाया। मैं लगभग पागल था –

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