javascript - Express - 在后续 SSE 请求之间不会保存 session

标签 javascript node.js session express server-sent-events

我正在使用 Node.js 和 Express 探索服务器发送的事件。 我设法设置请求处理和流写入,但现在我在 session 管理方面遇到困难,因为我无法在后续调用之间保留 session 。

服务器代码:

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/并发送我的名字一次时,我可以看到服务器在控制台上记录调用并设置 session 数据和cookie。

如果我再次发送我的名字,则会设置 session cookie,但 session 为空,因此会再次发送 session cookie。

如何在调用之间存储 session 数据?

最佳答案

resave 句柄告诉 session 保存您的 cookie 值。否则,您必须根据每个请求手动重新设置它们。

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

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

resave - forces session to be saved even when unmodified. (default: true)

关于javascript - Express - 在后续 SSE 请求之间不会保存 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24628006/

相关文章:

javascript - 包含点的属性的 watchCollection

linux - 无法访问亚马逊 AWS 托管的 nodeJs 项目

node.js - 在开发工作流程中使用 docker

php - 从 Windows 迁移到 Linux 服务器,现在出现 session 错误

java - session在几个servlet之间是否存在同步问题?

ruby-on-rails - 检测 Rails 4 session cookie 篡改

使用 JSF 的 Javascript 奇怪逻辑运算符行为 : `&&`

javascript - 浏览器期望一个简短的变量输入无法通过 python Selenium 传递

javascript - 在我的 meteor 应用程序上添加 Google map

node.js - Node 邮件程序 DEPTH_ZERO_SELF_SIGNED_CERT