2 Stimmen

Express - Sitzung wird nicht zwischen aufeinanderfolgenden SSE-Anfragen gespeichert

Ich erkunde Server-Sent Events mit Node.js und Express. Ich habe es geschafft, die Anfragenbearbeitung und das Schreiben des Streams einzurichten, aber jetzt habe ich Probleme mit der Sitzungsverwaltung, da ich die Sitzung nicht zwischen aufeinanderfolgenden Aufrufen beibehalten kann.

Server-Code:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var app = express();
// log all requests
app.use(function(req, res, next) {
    console.log(req.method, req.path);
    next();
});
app.use(cookieParser());
app.use(session({
    secret : 'pretty hard to guess',
    resave : false,
    saveUninitialized : true
}));

// serve test file
app.get('/', function(req, res) {
    res.sendfile(__dirname + '/sandbox/test.html');
});

app.get('/test/:name', function(req, res) {
    console.log(req.headers);

    // session is empty
    console.log(req.session)

    req.session.name = req.param('name');

    // session.name is set
    console.log(req.session);

    req.socket.setTimeout(Infinity);
    res.type('text/event-stream');
    console.log(res._headers)

    res.write('retry: 3000\n');
    res.write('data: Hello, SSE!\n\n');
});

var server = app.listen(8080, function() {
    console.log('listening on port 8080\n');
});

Kleine Client-App:

            function sendReq() {
                var name = document.getElementById('name').value;
                var es = new EventSource('test/' + name);
                es.onopen = function() {
                    var ul = document.getElementById('board');
                    var li = document.createElement('li');
                    li.textContent = 'Connected...';
                    ul.appendChild(li);
                };
                es.onmessage = function(e) {
                    var ul = document.getElementById('board');
                    var li = document.createElement('li');
                    li.textContent = e.data;
                    ul.appendChild(li);
                };
                return false;
            }

Wenn ich auf localhost:8080/ zugreife und einmal meinen Namen sende, sehe ich, dass der Server den Aufruf in der Konsole protokolliert und die Sitzungsdaten und den Cookie setzt.

Wenn ich meinen Namen erneut sende, wird das Sitzungscookie gesetzt, aber die Sitzung ist leer, sodass das Sitzungscookie erneut gesendet wird.

Wie kann ich es schaffen, die Sitzungsdaten zwischen den Aufrufen zu speichern?

0voto

fmsf Punkte 35002

Der

resave handle teilt der Session mit, dass Ihre Cookie-Werte erhalten bleiben sollen. Andernfalls müssen sie bei jeder Anfrage manuell neu gesetzt werden.

app.use(session({
    secret : 'ziemlich schwer zu erraten',
    resave : true, <-----
    saveUninitialized : true
}));

Zitat aus den Dokumenten https://github.com/expressjs/session:

resave - zwingt die Session zum Speichern, auch wenn sie unverändert ist. (Standard: true)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X