如何在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.js
configuration的。