带有多个命名空间的Socket.io?

我有一个路由,听一个特定的路由ID。

/** * Chat app routes. */ app.get('/games/:id', gameChatController.chatRoom); 

根据路由id我可以确定聊天是什么游戏。

我的问题是如何使用此传递到socket.io?

斌/ WWW

 /* * setup socket.io, and socket-session */ var socketIO = require('socket.io'); var io = socketIO(server); var SessionSocket = require('session.socket.io'); var sessionSockets = new SessionSocket(io, app.sessionStore, app.cookieParser); var setEvents = require('../events'); setEvents(sessionSockets); 

事件/ index.js

 'use strict'; var redis = require('redis'); var sub = redis.createClient(); var pub = redis.createClient(); sub.subscribe('chat'); module.exports = function(io) { // here io basically is sessionSockets // TODO: Set a namespace, make it dynamic var theRoom = 'fifa14'; var namespaceRoom = io.of('/'+theRoom); namespaceRoom.on('connection', function(err, socket, session) { if (!session.user) return; console.log(socket); } } 

所以我所要求的是如何构build这个,以便我可以轻松地通过应用程序的当前状态来匹配套接字名称空间的状态,因此特定游戏中的用户只能在那里聊天?

因为我不认为做下面的事情是非常有效的

控制器/ chat.js

 /** * GET / * ChatRoom page. */ exports.chatRoom = function(req, res) { /* * setup socket.io, and socket-session */ var socketIO = require('socket.io'); var io = socketIO(server); var SessionSocket = require('session.socket.io'); var sessionSockets = new SessionSocket(io, app.sessionStore, app.cookieParser); var setEvents = require('../events'); // so here I can pass the route parameters, not efficient! setEvents(sessionSockets, req.params.id); res.render('chatRoom', { roomName: req.params.id }); }; 

所以现在我可以传入一个新的游戏ID到setEvents() ,但是我认为这可能会更好。

 'use strict'; var redis = require('redis'); var sub = redis.createClient(); var pub = redis.createClient(); sub.subscribe('chat'); module.exports = function(io, gameId) { // here io basically is sessionSockets // Now I can pass the proper id var namespaceRoom = io.of('/'+gameId); namespaceRoom.on('connection', function(err, socket, session) { if (!session.user) return; console.log(socket); } } 

很难确切地告诉你在这里问什么问题,所以我将在概念上解释这是如何工作的。

您的聊天应用程序路由是按客户端。 每个客户分别打这个路线。 如果你想与来自同一客户端的未来传入的socket.io连接共享一些状态,你有两种主要的方式:

  1. 当路由被击中时,您可以设置一个cookie并将特定的状态放在cookie中。 然后,当传入的socket.io连接到达时,您可以检查cookie以查看此套接字应该到哪个聊天室。

  2. 当路由被击中时,你可以设置一个会话ID(作为一个cookie),然后在某种会话存储中存储一些状态。 然后,当来自客户端的传入socket.io连接到达时,您从cookie中获取会话ID,然后可以查看会话存储以查看此socket.io连接的状态。

你不能直接将任何东西传递给socket.io,因为传入的http路由和传入的socket.io连接都是每个客户端,并且不在同一时间,所以你不能设置关于特定的未来socket.io连接的全局状态。 相反,您使用客户端cookie来设置特定客户端上的某个状态或build立会话ID,以便状态可以在您的会话存储中。