gpt4 book ai didi

javascript - 在使用socket.io时获取express.js中的当前用户?

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:08 26 4
gpt4 key购买 nike

我正在使用express框架,并且我的网络应用程序的一部分使用socket.io来启用实时聊天。我需要获取当前用户的用户名,并创建一个包含他的房间。问题是我找不到在调用 socket.on('connection') 时获取用户信息的方法。这是我到目前为止的相关代码:

var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var session = require('express-session');
var http = require('http');
var routes = require('./routes/index');
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);

server.listen(4000);
app.use(session({secret : 'anything',
saveUninitialized: true,
resave: true}));
app.use(passport.initialize());
app.use(passport.session());

mongoose.connect('mongodb://localhost/my_db');
var Schema = mongoose.Schema;
var UserDetail = new Schema({
username: String,
password: String
}, {
collection: 'users'
});
var UserDetails = mongoose.model('users', UserDetail);

app.use('/', routes);
app.use('/users', users);

app.post('/login',
passport.authenticate('local', {
successRedirect: '/loginSuccess',
failureRedirect: '/loginFailure',
})
);

io.on('connection', function(socket) {
console.log('socket stuff');
var sessionStore = session;
var sessionId = socket.handshake.sessionId;

sessionStore.get(sessionId, function(err, session) {
if(!err) {
console.log('no error');
if(session.passport.user) {
console.log('This is the users email address %s', session.passport.user);
}
}
});
socket.emit('newMessage', {content : 'Chat message content'});
});

最后一个函数是我遇到问题的地方。当用户请求页面时,我可以通过 req.user 找到他们的用户名,但是当我没有 req 时我不知道该怎么做。我在 io.on('connection') 中的 session 代码根本不起作用,只会抛出错误,我想我会保留它以显示我到目前为止所尝试的内容。

最佳答案

这个问题已经被问过几次了,但我发现旧的答案不再有效。答案在于解析 socket.handshake.headers.cookie 但这是 hacky,并且取决于 express-session 的内部结构。

无论如何,这现在应该适用于 Express 4 和 socket.io 1.1:

var express   = require('express'),
session = require('express-session'),
cookie = require('cookie'),
signature = require('cookie-signature');

var app = express(),
store = new session.MemoryStore(),
secret = 'session-secret-key',
name = 'connect.sid';

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

var server = require('http').createServer(app),
io = require('socket.io')(server);

io.on('connection', function(socket) {
if (socket.handshake && socket.handshake.headers && socket.handshake.headers.cookie) {
var raw = cookie.parse(socket.handshake.headers.cookie)[name];
if (raw) {
// The cookie set by express-session begins with s: which indicates it
// is a signed cookie. Remove the two characters before unsigning.
socket.sessionId = signature.unsign(raw.slice(2), secret) || undefined;
}
}
if (socket.sessionId) {
store.get(socket.sessionId, function(err, session) {
console.log(session);
});
}
});

关于javascript - 在使用socket.io时获取express.js中的当前用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com