简体   繁体   English

如何使用connect-sqlite3与express和websocket共享会话?

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

I need to share sessions between express-session (v4) GET requests and WebSockets on('connection') using connect-sqlite3. 我需要使用connect-sqlite3在express-session(v4)GET请求和WebSockets on('connection')上共享会话。

The following basic setup without sqlite3 (from Azmisov's answer at ExpressJS & Websocket & session sharing ) works: 以下不带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 + ".");
    });
});

However, when I try to implement this with connect-sqlite3: 但是,当我尝试使用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 get: 在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.

This error still occurs if I change to: 如果我更改为:仍然会发生此错误:

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

The error goes away if I take out "req": 如果我取出“ req”,错误消失了:

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

But then the sessionParser function does not get called, and req.session.working is not shown in the console. 但是,然后不会调用sessionParser函数,并且控制台中不会显示req.session.working。

The session does actually get saved to the sqlite3 database. 该会话实际上确实已保存到sqlite3数据库。

Any help much appreciated, thanks! 任何帮助,不胜感激,谢谢! Eric T. 埃里克·T。

I managed to fix it using cookie-parser and cookie in the websocket on('connection'). 我设法在websocket on('connection')上使用cookie解析器和cookie来修复它。

Note that I had to declare MySessionStore outside the app.use() so that I could perform a get() on it. 请注意,我必须在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.

相关问题 connect-sqlite3会话存储区是否不需要数据库主机/端口? - No DB host/port required for connect-sqlite3 session store? 如何使用 express 和 typescript 正确共享上下文 - How do I properly share context using express and typescript 如何使用Node在同一端口上使用带有Express的Websocket来使用HTTP? - How do I get HTTPs w/ Express working with websockets on the same port using node? 如何在已安装的快递应用中共享会话 - How to share sessions in mounted express apps 如何跨子域共享快速会话? - How to share express sessions across subdomains? 如何使用node.js express-session关闭单独的会话? - How do I close separate sessions using node.js express-session? 使用inversify-express-utils,如何集成WebSocket? - Using inversify-express-utils, how can i integrate websockets? 如何使用smb2模块连接到nodejs中的samba共享? - How do I connect to a samba share in nodejs using the smb2 module? 需要澄清connect-mongo,如何在nodejs中将它用于带有express的会话 - connect-mongo clarification needed, how to use it for sessions with express in nodejs 如何使用express和connect-flash显示没有页面刷新的flash消息? - How do I display flash message without page refresh using express and connect-flash?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM