Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 未使用sessession.socket.io-express4定义会话_Node.js_Socket.io_Session.socket.io - Fatal编程技术网

Node.js 未使用sessession.socket.io-express4定义会话

Node.js 未使用sessession.socket.io-express4定义会话,node.js,socket.io,session.socket.io,Node.js,Socket.io,Session.socket.io,我正在使用以下模块开发NodeJs: 快报4.9.8 快速课程1.9.3 socket.io 1.2.1 session.socket.io-express4 0.0.3 我正在尝试使用以下代码从app.js中的session.socket.io-express4获取会话: 首先是app.js中所有内容的初始化: var server = app.listen(3000, function() { debug('Express server listening on port ' + ser

我正在使用以下模块开发NodeJs:

快报4.9.8

快速课程1.9.3

socket.io 1.2.1

session.socket.io-express4 0.0.3

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

首先是app.js中所有内容的初始化:

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);
my socket.js:

function handleSocket(sessionSockets) {
     sessionSockets.on('connection', function (err, socket, session) {
          console.log("session : " + session);
    });
}

module.exports = handleSocket;
问题是会话未定义。有什么想法吗

更新 所以我试着用socket.io-sessions代替

这是我的代码:

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);
我的models/socket.js文件包括:

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;
这是我得到的错误:

/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)
更新 原始答案中对问题的解释仍然是相关的,但修复方法更简单(也更安全)。只需使用socket.io-session即可。session.socket.io-express4模块只有在使用连接版本的cookieParser时才是必需的,cookieParser与较新的cookie解析器没有相同的签名处理

原始答案 这是由于sessession.socket.io-express4在同时使用cookie解析器机密和express会话机密时出现错误所致。发生的情况是sessession.socket.io-express4正在尝试取消connect.sid cookie的签名。你可以看到:

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

签名cookie看起来像
s:。
,并且正则表达式选择
之间的任何值,这将是签名cookie的值。问题是,如果您传入一个秘密,cookie解析器将删除签名本身。这意味着session.socket.io-express4需要
s:。
,但接收的是
,因此正则表达式返回undefined。为了解决这个问题,您可以省略cookie解析器中的秘密

我已经提交了一份修复此错误的报告,因此您必须使用与express会话具有相同秘密的cookie解析器

tl;博士 不要向cookie解析器提供秘密。以下各项应如您所期望的那样起作用:

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);

我得到的错误是“无法通过key:connect.sid查找会话”作为错误参数sessionSockets.on('connection')回调。与此问题相关的问题->请原谅我是noob,但您建议使用socket.io-session。在io.set(‘授权’等)不再工作的socket.io v1中,如何使用它?
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);