问题描述
我想使用 socket.io 来跟踪应用程序的日常活动用户.我的套接字连接看起来像这样:
I would like to use socket.io to keep track of daily active users of an application. My socket connection looks like this:
let visitorData = {};
io.on('connection', (socket) => {
socket.on('user', (data) => {
visitorData[socket.id] = data;
})
socket.on('disconnect', () => {
delete visitorData[socket.id]
})
})
我希望能够合并现有的Node/Express 路由和接收到套接字连接的数据.特别是,我将如何处理到/login
端点的POST,以将登录用户名与套接字ID连接相关联.
I would like to be able to incorporate existing Node/Express routes and the data received to socket connections. In particular, how would I handle a POST to a /login
endpoint to associate the login username to the socket id connection.
例如:
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
信息?
Is there a way I can incorporate socket.io into Node/Express routes to (a) associate the user with a socket.id and (b) emit
information from a request/response body?
推荐答案
我使用 passport socket.io .它创建了允许您从套接字访问用户的中间件.这是我的一些实现:
I set up something just like this using passport socket.io. It creates middleware that allows you to access users from sockets. Here is some of my implementation:
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
中配置的.
In order to use this you need to use a session store. I personally used a redis session store, connect-redis. This is configured in lib/session.js
.
这篇关于如何在Node/Express路由和Socket.io之间进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!