【问题标题】:How do I share sessions with express and websockets using connect-sqlite3?如何使用 connect-sqlite3 与 express 和 websockets 共享会话?
【发布时间】:2018-08-17 20:56:10
【问题描述】:

我需要使用 connect-sqlite3 在 express-session (v4) GET 请求和 WebSockets on('connection') 之间共享会话。

以下没有 sqlite3 的基本设置(来自 Azmisov 在ExpressJS & Websocket & session sharing 的回答)有效:

global.app = express();
var sessionParser = require('express-session')({
    secret:"some secret",
    resave: true,
    saveUninitialized: true
});
app.use(sessionParser);

app.get('*', function (req, res) {
    req.session.working = "Yes";
});

wss.on('connection', function connection(ws, req) {
    sessionParser(req, {}, function(){
        console.log("New websocket connection: Working = " + req.session.working + ".");
    });
});

但是,当我尝试使用 connect-sqlite3 实现此功能时:

var sessionParser = require('express-session');
var SQLiteStore = require('connect-sqlite3')(sessionParser);
app.use(sessionParser({
    store: new SQLiteStore({dir:configuration.data_dir, db:'sessions.s3db', table:'sessions'}),
    secret: 'some secret',
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge: configuration.session_cookie_maxage_ms,
        name: 'shadowlands'
    },
}));

app.get('*', function (req, res) {
    req.session.working = "Yes";
});

wss.on('connection', function connection(ws, req) {
    sessionParser(req, {}, function(){
        console.log("New websocket connection: Working = " + req.session.working + ".");
    });
});

在 sessionParser(req, {}, function(){ ...) 的 wss on('connection') 中,我得到:

express-session deprecated undefined resave option; provide resave option; provide resave option.
express-session deprecated undefined saveUninitialized option; provide saveUninitialized option; provide saveUninitialized option.
express-session deprecated req.secret; provide secret option.

如果我更改为:仍然会出现此错误:

sessionParser(req, {secret: 'some secret', resave: false, saveUninitialized: true}, function(){

如果我取出“req”,错误就会消失:

sessionParser({secret: 'some secret', resave: false, saveUninitialized: true}, function(){

但是随后 sessionParser 函数没有被调用,并且 req.session.working 没有显示在控制台中。

会话确实保存到 sqlite3 数据库。

非常感谢任何帮助,谢谢! 埃里克·T。

【问题讨论】:

    标签: node.js express sqlite


    【解决方案1】:

    我设法在 websocket on('connection') 上使用 cookie-parser 和 cookie 修复它。

    请注意,我必须在 app.use() 之外声明 MySessionStore,以便我可以对其执行 get()。

    var sessionParser = require('express-session');
    var SQLiteStore = require('connect-sqlite3')(sessionParser);
    var MySessionStore = new SQLiteStore({dir:configuration.data_dir, db:'sessions.s3db', table:'sessions'});
    var cookieParser = require('cookie-parser');
    var cookie = require('cookie');
    app.use(cookieParser())
    var sessionParser = require('express-session');
    app.use(sessionParser({
        resave: true,
        saveUninitialized: true,
        secret: "some secret",
        store: MySessionStore,
        cookie: { maxAge: 7 * 24 * 60 * 60 * 1000 } // 1 week
    }));
    
    // ============
    
    app.get('*', function (req, res) {
        req.session.working = "Yes";
    });
    
    // ============
    
    wss.on('connection', function connection(ws, req) {
    
        var got_cookie = false;
    
        var cookies = cookie.parse(req.headers.cookie);
        var sessionID = cookieParser.signedCookie(cookies['connect.sid'], "some secret");
        MySessionStore.get(sessionID, function(err, sess) {
            functions.write_log("session", "WSS: New websocket connection: " + "Working = '" + sess.working + "'.");
            got_cookie = true;
        });
    
        // Optional, if you need a synchronous return from the function. 
        require('deasync').loopWhile(function(){return !got_cookie;});
    
    });
    

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2012-03-06
      • 2015-03-26
      相关资源
      最近更新 更多