【问题标题】:How can I communicate between Node/Express routes and Socket.io如何在 Node/Express 路由和 Socket.io 之间进行通信
【发布时间】:2017-05-02 16:05:04
【问题描述】:

我想使用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 路由 和接收到的数据合并到套接字连接。特别是,我将如何处理到 /login 端点的 POST 以将登录用户名与套接字 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 信息相关联?强>

【问题讨论】:

  • 嗯,类似的想法。但是那篇文章与 PHP 和会话有关……我正在处理 Node/Express,而我的问题与会话无关。只需将路由请求/响应主体合并到套接字中。
  • 您是要跟踪活跃用户,还是只计算当前活跃用户的数量?你到底想用这个做什么?它是一个聊天工具,可以跟踪房间里的人数吗?计数比单独跟踪每个用户要容易得多。如果您需要多个服务器(cpu 内核),这也变得更具挑战性,如果您有很多人,您将需要这些服务器。
  • 我想跟踪活动用户并将用户名(在 /login POST 上)与给定的套接字 ID 相关联,然后发出该数据以供客户端使用。

标签: node.js express socket.io


【解决方案1】:

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

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 session store,connect-redis。这是在lib/session.js 中配置的。

【讨论】:

  • 我已经有一个不使用connect-redis 的现有会话/节点配置设置。我只是在使用 JWT。
  • 抱歉,我不知道您的设置有多灵活。您可以使用this 列表中的任何会话存储,因此您不需要专门使用redis。恐怕我目前没有其他实现。
  • 酷不用担心。 JWT 根本不使用会话。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2013-05-05
  • 2016-10-29
  • 2018-08-29
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多