Я использую socket.io с Express.Получение соединения socket.io, относящегося к HTTP-запросу
Скажем, пользователь попадает в канонический маршрут /, и запрос получает направляется на:
app.get('/',function(req,res,next){
var msg =...;
socket.emit('channel',msg); //how do I find the right socket object that pertains to this HTTP request?
});
, что это лучший способ найти сокет-соединения, относящуюся к этому запросу HTTP с Socket.io?
Мое лучшее предположение заключается в том, чтобы отмечать сокеты с идентификатором сеанса при аутентификации сокета, а затем извлекать их позже (в таком месте, как функция выше) с тем же идентификатором сеанса связи? Идентификатор сеанса доступен на объекте запроса в промежуточном программном обеспечении Express.
Также у меня есть эта привязка Socket.io к серверу экспресс-код:
var server = http.createServer(app).listen(port);
var io = require('socket.io').listen(server); //we need to bind socket.io to the http server
и мой собственный модуль socketio, я делаю это:
var cookie = require("cookie");
var connect = require("connect");
var io = null;
var connectedUsers = {}; //hash of sockets with socket.id as key and socket as value
var init = function ($io) {
if (io === null) {
io = $io;
io.use(function (socket, next) {
var handshakeData = socket.request;
if (handshakeData.headers.cookie && handshakeData.cookie) {
handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);
//handshakeData.sessionID = connect.utils.parseSignedCookie(handshakeData.cookie['express.sid'], 'foo'); //pass session secret at end
handshakeData.sessionID = cookie.parse(handshakeData.cookie['express.sid'], 'foo'); //pass session secret at end
if (handshakeData.cookie['express.sid'] == handshakeData.sessionID) {
return next('Cookie is invalid.', false);
}
} else {
return next('No cookie transmitted.', false);
}
console.log('user with socket.id=', socket.id, 'has authenticated successfully.');
return next(null, true);
});
io.on('connection', function (socket) {
console.log('a user connected - ', socket.id);
connectedUsers[socket.id] = socket;
socket.on('chat message', function (msg) {
console.log(socket.id, 'says', msg);
socket.emit('chat message', 'hey baby hey - I am '.concat(socket.id));
});
socket.on('disconnect', function() {
console.log('user disconnected -', socket.id);
connectedUsers[socket.id] = null;
});
});
}
else if ($io != null) {
throw new Error('tried to re-init socketio.js by passing new value for io in?? what are you doing.')
}
else {
}
return {
addListener: function(){
}
};
module.exports = init;