Les sessions ne seront pas sauvegardées dans Node.js sans req.session.save ()
Je suis en train de construire un site web à l'aide de Node.js, Express, et Redis pour la gestion des sessions. Pour quelque raison que ce soit, si j'ai une variable de session (isLoggedIn
dans cet exemple), et j'ai actualiser la page, la variable n'est pas d'être sauvés, cependant, si je l'appelle req.session.save()
après la définition de la variable, il est enregistré à Redis (redis-cli moniteur montre ce - pas appeler save()
montre que la variable n'est pas là, alors que l'appel de save()
montre).
Je vais l'utiliser pour configurer et démarrer le serveur:
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);
Et puis, dans cette voie, j'ai:
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;
De cela, je devrais être capable de naviguer à /login
ont la séance isLoggedIn de vrai, et qui devrait enregistrer automatiquement à Redis. Après cela, à la tête de /
devrait me dire que je suis connecté. Chargement /login
ne définissez la variable, le deuxième journal indique que, mais le chargement de /
dit que je ne suis pas connecté. redis-cli moniteur montre
1414076171.241836 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}"
lors de l'enregistrement, qui ne comprend pas les isLoggedIn
variable, mais en ajoutant dans req.session.save()
montre:
1414076475.601644 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"isLoggedIn\":true}"
La moindre idée de pourquoi j'ai appeler req.session.save()
lorsque tous les exemples que j'ai vu ne l'utilise pas?
source d'informationauteur PuppyKevin | 2014-10-23
Vous devez vous connecter pour publier un commentaire.
Bon, alors, j'ai pensé à elle. Je vais mettre la réponse ici pour quelqu'un d'autre qui arrive à se faire prendre sur cette.
Pour les requêtes GET, le serveur suppose que vous allez être l'envoi de données de retour, et enregistre automatiquement les données de session, une fois que la route est entièrement traitée.
Pour les requêtes POST (que j'utilise), cependant, la même hypothèse n'a pas été fait. États de la Session sont enregistrés uniquement dans l'une des deux conditions - soit lorsque des données sont envoyées (par
res.send
res.redirect
etc.), ou si vous avez manuellement appelreq.session.save()
. J'étais déjà appelant /connexion à partir d'une requête AJAX, je n'ai pas de retourner quoi que ce soit si certaines conditions sont remplies. Avoir le serveur de répondre au client avec des données après la définition de la variable de session fixe.