As sessões não irão gravar no nó.js sem req.sessao.salvar()

Estou a construir um site usando o nó.js, Express e Redis para gestão de sessões. Por qualquer razão, se eu tiver uma variável de sessão (isLoggedIn neste exemplo), e eu atualizar a página, a variável não são salvos, no entanto, que se eu chamar req.session.save() depois de definir a variável, que faz ficar guardado para Redis (redis-cli monitor mostra isso - e não chamar save() mostra que a variável não existe, ao passo que chamar save() mostra-o).

Estou a usar isto para preparar e iniciar o ... servidor:

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);

e depois, nessa rota, tenho:

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;

a partir disso, devo ser capaz de navegar para /login, ter a sessão configurada como verdadeira, e isso deve salvar automaticamente para Redis. Depois disso, ir para / deve dizer-me que estou ligado. O carregamento {[[8]} define a variável, o segundo registo mostra isso, mas o carregamento / diz que não estou registado. o monitor redis-cli mostra

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

ao salvar, o que não inclui a variável isLoggedIn, mas adicionar em req.session.save() mostra:

1414076475.601644 "setex" "sess:FIDJ9qDbX_0u9pzlC6VZEW76zZcyiPME" "86400" "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"isLoggedIn\":true}"
Faz ideia porque tenho de ligar quando todos os exemplos que vi não o usam?

Author: Chris Krycho, 2014-10-23

1 answers

Está bem, já descobri. Vou colocar a resposta aqui para qualquer um que seja apanhado nisto.

Para obter pedidos, o servidor assume que você vai estar enviando dados de volta, e irá gravar automaticamente dados de sessão uma vez que a rota é totalmente processada.

Para pedidos de POST (o que estou usando), no entanto, a mesma suposição não é feita. Os estados de sessão só são salvos em uma de duas condições-ou quando os dados estão sendo enviados para fora (através res.send, res.redirect, etc.), ou se ligar manualmente para req.session.save(). Eu já estava ligando / login de um pedido AJAX, eu só não estava retornando nada se certas condições foram cumpridas. Ter o servidor responder ao cliente com alguns dados depois de definir a variável de sessão corrigiu isso.

 93
Author: PuppyKevin, 2015-11-08 00:54:00