如何使用 connect-sqlite3 与 Express 和 websockets 共享会话



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

以下没有sqlite3的基本设置(来自Azmisov在ExpressJS&Websocket和会话共享中的回答(有效:

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 + ".");
    });
});

In wss on('connection'( at sessionParser(req, {}, function(({ ...(, I 得到:

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 数据库中。

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

·

我设法在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;});
});

最新更新