如何在NodeJS的socket.io中访问Cookie会话中间件?

我决定在我的应用程序中使用socket.io,并偶然发现了一个问题。 我使用cookie-session进行快速授权:

 var session = require('cookie-session'); var app = express(); // ... app.use(session({ keys: ['secretkey1', 'secretkey2'] })) // ... app.get('/settings', function(req, res) { res.type("html"); if (!req.session.sid) { console.log("NO SID"); req.session.sid = util.randomString(); } else { console.log("sid:" + req.session.sid); } // doing stuff with req.session.sid var jadeView = { /*...*/ }; res.status(200).send(mainJade(jadeView)); }); 

现在我使用socket.io。 我想出了如何访问cookie:

 io.sockets.on('connection', function(socket) { var cookie_string = socket.request.headers.cookie; console.log("cookies: " + cookie_string); // ... } 

但是,如何将cookie_string转换为会话对象,就像在req.session

什么改变了

@ rmflow从2014年的答案似乎没有在2017年使用socket.io-client 2.0.2和cookie会话 2.0.0

显然, cookie包(cookie会话的主要依赖)需要有些不同的请求和响应对象。 也就是说,请求对象应该有一个带有布尔encrypted属性的connection对象; 另外,响应对象应该有getHeadersetHeader方法。

更新解决scheme

 const session = require('cookie-session')({ name: 'some-session-name', secret: 'some-session-secret', // or an array of keys as usual ... // Other relevant options }); io.on('connection', socket => { let cookieString = socket.request.headers.cookie; let req = {connection: {encrypted: false}, headers: {cookie: cookieString}} let res = {getHeader: () =>{}, setHeader: () => {}}; // session(req, res, () => { console.log(req.session); // Do something with req.session }) }) 

想通了自己:

 var req = { headers : {cookie : cookie_string} } session({ keys: ['secretkey1', 'secretkey2'] })(req, {}, function(){}) console.log(req.session.sid);