我决定在我的应用程序中使用 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
转换为 session 对象,如 req.session
中那样?
最佳答案
发生了什么变化
@rmflow 2014 年的答案似乎不适用于 2017 年 socket.io-client 2.0.2 和 cookie-session 2.0.0
显然,cookies包(cookie-session 的主要依赖项)期望请求和响应对象有所不同。也就是说,请求对象应该有一个带有 bool 加密
属性的connection
对象;此外,响应对象应具有 getHeader
和 setHeader
方法。
更新的解决方案
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
})
})
关于node.js - 如何在 NodeJS 上访问 socket.io 中的 cookie-session 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174566/