首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话未使用sesssion.socket.io-express4 4进行定义。

会话未使用sesssion.socket.io-express4 4进行定义。
EN

Stack Overflow用户
提问于 2014-12-03 16:03:00
回答 1查看 1.6K关注 0票数 3

我正在开发一个具有以下模块的NodeJs:

4.9.8号特快 明示-会议1.9.3 socket.io 1.2.1 session.socket.io-express4 4 0.0.3

我试图使用以下代码从app.js中的session.socket.io-express4 4获取会话:

首先是app.js中所有东西的init:

代码语言:javascript
复制
var server = app.listen(3000, function() {
  debug('Express server listening on port ' + server.address().port);
});

var io = require('socket.io')(server);
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser('bingo');

app.use(session({
secret: 'bingo',
cookie: {httpOnly: true, secure: true, maxAge: new Date(Date.now() + 3600000)},
store: sessionStore,
resave: true,
saveUninitialized: true
}));

var SessionSockets = require('session.socket.io-express4');
sessionSockets = new SessionSockets(io, sessionStore, cookieParserVar);
require('./models/socket.js')(sessionSockets);

我的socket.js:

代码语言:javascript
复制
function handleSocket(sessionSockets) {
     sessionSockets.on('connection', function (err, socket, session) {
          console.log("session : " + session);
    });
}

module.exports = handleSocket;

问题是会话是未定义的。有什么想法吗?

更新

所以我试着用Socket.IO会话代替。

这是我的密码:

代码语言:javascript
复制
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser();

app.use(session({
    secret: 'bingo',
    key: 'express.sid',
    store: sessionStore,
    resave: true,
    saveUninitialized: true
}));

io.set("authorization", socketIoSessions({
    key:    'express.sid',       //the cookie where express (or connect) stores its session id.
    secret: 'bingo', //the session secret to parse the cookie
    store:   sessionStore      //the session store that express uses
  }));

require('./models/socket.js')(io);

我的模型/socket.js文件包括:

代码语言:javascript
复制
function handleSocket(sock) {
        sock.on('connection',function(socket)
        {
                socket.handshake.getSession(function (err, session) {
                        console.log("HERHERHEHREHREHRHEHERHERHRHERHERHEHREHREHREHR");
                        console.log(session);
                        console.log(err);
                });
                require('../commands/echo.js')(sock);
        });
}

module.exports = handleSocket;

这是我得到的错误:

代码语言:javascript
复制
/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/models/socket.js:8
            socket.handshake.getSession(function (err, session) {
                             ^
TypeError: Object #<Object> has no method 'getSession'
at Namespace.<anonymous> (/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/models/socket.js:8:34)
at Namespace.emit (events.js:95:17)
at Namespace.emit (/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/node_modules/socket.io/lib/namespace.js:205:10)
at /mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/node_modules/socket.io/lib/namespace.js:172:14
at process._tickCallback (node.js:419:13)

我错过了什么?

上一次更新

as会话按预期工作。我唯一需要更改的是授权回调,以便它与socket.io-1.0兼容,我做了以下工作:

代码语言:javascript
复制
io.use(function (socket, next) {
        var handshakeData = socket.handshake;
        ioSession(cookieParser(config.app.session_key), sessionStore)(handshakeData, next);
    }
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-11 07:03:59

更新

从最初的答案中对这个问题的解释仍然是相关的,但是修复方法要简单得多(而且更安全)。只需使用Socket.IO会话即可。只有在使用cookieParser的connect版本时才需要使用session.socket.io-Express 4模块,该版本的签名处理方式与新的cookie解析器不同。

原始答案

这是由于sesssion.socket.io-Express 4在使用cookie解析器机密和快速会话秘密时出现了错误。正在发生的事情是sesssion.socket.io-express4 4试图取消connect.sid cookie的签名。你可以看到这里

if(handshake.cookies && handshake.cookies[key]) handshake.cookies[key] = (handshake.cookies[key].match(/\:(.*)\./) || []).pop();

签名的cookie看起来像这个s:<value>.<signature>,正则表达式在:.之间选择任何东西,这将是签名cookie的值。问题是,如果您传递一个秘密,cookie解析器将删除签名本身。这意味着session.socket.io-Express 4期待的是s:<value>.<signature>,而是接收<value>,因此regex返回未定义的值。要解决这个问题,您可以省略cookie解析器中的秘密。

我已经为这个bug提交了一个修复程序的将请求拉到session.socket.io-express4 4,所以您必须使用和快速会话同样的秘密的cookie解析器。

tl;dr

不要向cookie解析器提供秘密。以下内容应如您所期望的那样工作:

代码语言:javascript
复制
var server = app.listen(3000, function() {
  debug('Express server listening on port ' + server.address().port);
});

var io = require('socket.io')(server);
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser();

app.use(session({
    secret: 'bingo',
    store: sessionStore,
    resave: true,
    saveUninitialized: true
}));

var SessionSockets = require('session.socket.io-express4');
sessionSockets = new SessionSockets(io, sessionStore, cookieParserVar);
require('./models/socket.js')(sessionSockets);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27276243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档