簡體   English   中英

如何使用connect-sqlite3與express和websocket共享會話?

[英]How do I share sessions with express and websockets using connect-sqlite3?

我需要使用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 + ".");
    });
});

在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。

我設法在websocket on('connection')上使用cookie解析器和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;});

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM