如何在Node / Express路由和Socket.io之间进行通信

我想使用socket.io跟踪应用程序的日常活动用户。 我的套接字连接如下所示:

let visitorData = {}; io.on('connection', (socket) => { socket.on('user', (data) => { visitorData[socket.id] = data; }) socket.on('disconnect', () => { delete visitorData[socket.id] }) }) 

我希望能够将现有的Node / Express 路由和接收到的数据合并到套接字连接中。 特别是,我将如何处理POST到/login端点以将login用户名与套接字id连接相关联。

例如:

 app.get('/login', (req, res, next) => { const someSocket = /* socket */ const someSocketId = /* socket id */; visitorData[someSocketId] = req.body.username; someSocket.emit('user', visitorData); }) 

有没有办法,我可以将socket.io纳入Node / Express路由(a)将用户关联到一个socket.id和(b)从请求/响应主体emit信息?

我使用passport socket.io设置了类似这样的东西。 它创build了允许您从套接字访问用户的中间件。 这是我的一些实现:

app.js

 import GameSocket from './lib/game-socket'; var app = express(); GameSocket(app, 3700); 

lib/game-socket.js

 import Server from 'socket.io'; import passportSocketIo from 'passport.socketio'; import cookieParser from 'cookie-parser'; // Configured redisStore for authentication import {redisStore} from '../lib/session'; // Configured passport strategy for authentication import passport from '../lib/passport'; export default function GameSocket(app, port) { // Setup socket var server = new Server(); var io = server.listen(app.listen(port)); // Setup authentication io.use(passportSocketIo.authorize({ key: 'connect.sid', secret: 'your_secret', store: redisStore, passport: passport, cookieParser: cookieParser, success: (data, accept) => accept(null, true), failure: (data, message, err, accept) => { console.log(err); if(err) throw new Error(message); } })); // On connection listener io.sockets.on('connection', function (socket) { // This is an example of getting user info from the socket console.log('Success: New connection with: ', socket.request.user.username); // Add your socket events here }); return io; } 

为了使用这个,你需要使用会话存储。 我个人使用了一个redis会话存储, connect-redis 。 这是在lib/session.jsconfiguration的。