Expressjs + socket.io +快递会话 [英] Expressjs+socket.io+express-session

查看:105
本文介绍了Expressjs + socket.io +快递会话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  var app = require('express')(),
session = require('express-session'),
cookie = require('cookie'),
cookieParser = require('cookie-parser'),
manager = './sockets/manager');

var sessionStore = new session.MemoryStore();


app.use(cookieParser('secret'));
app.use(session({
name:'sid',
store:sessionStore,
secret:'secret',
saveUninitialized:true,
resave:true,
cookie:{
path:'/',
httpOnly:true,
secure:false,
maxAge:null
}
}));

var server = require('http')。Server(app).listen(8888),
io = require('socket.io')(server);

io.use(function(socket,next){
var data = socket.request;

if(data.headers.cookie){
data.cookie = cookie.parse(cookieParser.signedCookie(data.headers.cookie,'secret'));

console.log('data.cookies(%s)',JSON.stringify (data.cookie));
// print'io = id_place',cookie没有sid,为什么?

if(data.cookie.sid){
data.sid = request.cookie.sid;
sessionStore.get(request.cookie.sid,function(err,session){
request.session = session;
});
}
}

next();
});

manager.use(io);

控制台日志向我显示此cookie request.cookies({io:1HKSseNH5UrnJisSAAAA})。
我刚刚看到很多例子与expressjs 3和socket 0.9,但我有:


socket.io: ^ 1.0.6,
express:〜4.5.1,
express-session:〜1.6.4


,它不起作用。



有任何错误吗?

解决方案

我为您创建了解决方案:在此输入链接说明。正如你可以看到套接字对象具有握手属性,其中包含带有cookie的请求头。


I have this code in my server.js.

var app = require('express')(),
        session = require('express-session'),
        cookie = require('cookie'),
        cookieParser = require('cookie-parser'),
        manager = require('./sockets/manager');

var sessionStore = new session.MemoryStore();


app.use(cookieParser('secret'));
app.use(session({
    name: 'sid',
    store: sessionStore,
    secret: 'secret',
    saveUninitialized: true,
    resave: true,
    cookie: {
        path: '/',
        httpOnly: true,
        secure: false,
        maxAge: null
    }
}));

var server = require('http').Server(app).listen(8888),
    io = require('socket.io')(server);

io.use(function(socket, next) {
    var data= socket.request;

    if (data.headers.cookie) {
        data.cookie = cookie.parse(cookieParser.signedCookie(data.headers.cookie, 'secret'));

        console.log('data.cookies ( %s )', JSON.stringify(data.cookie)); 
        // print 'io=id_place', cookies doesn't have sid, why?

        if (data.cookie.sid) {
            data.sid = request.cookie.sid;
            sessionStore.get(request.cookie.sid, function(err, session) {
                request.session = session;
            });
        }
    }

    next();
});

manager.use(io);

Console log shows me this cookie request.cookies ( {"io":"lHKSseNH5UrnJisSAAAA"} ). I've just seen many examples with expressjs 3 and socket 0.9, but I have:

"socket.io": "^1.0.6", "express": "~4.5.1", "express-session": "~1.6.4"

and it doesn't work.

Have I any mistakes?

解决方案

I've created solution for you: enter link description here. As you can see socket object has handshake property which include request headers with cookie.

这篇关于Expressjs + socket.io +快递会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆