Express - Session不会在后续SSE请求之间被保存

Express - Session doesn't get saved between subsequent SSE requests

本文关键字:请求 SSE 之间 保存 Session Express      更新时间:2023-09-26

我正在用Node.js和Express探索服务器发送的事件。我设法设置了请求处理和流的写入,但现在我正在努力进行会话管理,因为我无法在后续调用之间持久化会话。

服务器代码:

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

小客户端应用程序:

<!DOCTYPE html>
<html>
    <head>
        <script>
            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;
            }
        </script>
    </head>
    <body>
        <form id=sse-form onsubmit="return sendReq();">
            <input id=name />
            <input type=submit />
            <ul id=board></ul>
        </form>
    </body>
</html>

当访问localhost:8080/并发送一次我的名字时,我可以看到服务器在控制台记录呼叫并设置会话数据和cookie。

如果我再次发送我的名字,会话cookie被设置,但会话是空的,所以会话cookie被再次发送。

如何在呼叫之间存储会话数据?

resave句柄告诉会话持久化您的cookie值。否则,您必须在每次请求时手动重新设置它们。

app.use(session({
    secret : 'pretty hard to guess',
    resave : true, <-----
    saveUninitialized : true
}));

引自文档https://github.com/expressjs/session:

resave -强制保存会话,即使未修改。(默认值:真正的)