node.js - Express.io 中的连接客户端

标签 node.js express chat express.io

我正在使用node.js 和express.io 开发一个简单的聊天应用程序

我想始终显示已连接客户端(或在线聊天)的列表。

express.io's doc ,一旦有新客户进入房间,就没有明确的方法来“获取”已连接的客户端列表,即只有“广播”而没有“获取”。

以前有人这样做过吗?

任何线索都会非常有帮助。

谢谢!

编辑:

在尝试了@jibsales的答案之后。我想我们已经快到了。客户返回给我的不是实际的客户数组,而是这个:

[ { id: 'OWix3sqoFZAa20NLk304',
namespace: 
 { manager: [Object],
   name: '',
   sockets: [Object],
   auth: false,
   flags: [Object],
   _events: [Object] },
manager: 
 { server: [Object],
   namespaces: [Object],
   sockets: [Object],
   _events: [Object],
   settings: [Object],
   handshaken: [Object],
   connected: [Object],
   open: [Object],
   closed: [Object],
   rooms: [Object],
   roomClients: [Object],
   oldListeners: [Object],
   sequenceNumber: 496205112,
   router: [Object],
   middleware: [],
   route: [Function],
   use: [Function],
   broadcast: [Function],
   room: [Function],
   gc: [Object] },
disconnected: false,
ackPackets: 0,
acks: {},
flags: { endpoint: '', room: '' },
readable: true,
store: { store: [Object], id: 'OWix3sqoFZAa20NLk304', data: {} },
_events: 
 { error: [Function],
   ready: [Function],
   connection: [Function],
   NewChatPrivateLine: [Function],
   NewIdea: [Function],
   NewChatLine: [Function],
   NewPost: [Function] } } ]

功能是:

var app = require('express.io')();
app.io.route('connection', function(req) {
  req.io.join(req.data.room);
  var clients = app.io.sockets.clients(req.data.room);
  console.log(clients)
  app.io.room(req.data.room).broadcast('announce', {
    user: req.data.user,
    clients: clients
  }) 
});

这实际上会返回一个错误( data = JSON.stringify(ev); TypeError: Converting Circle Structure to JSON),因为数组有多个循环对象,因此无法广播。

有什么想法吗?

最佳答案

因为 express.io 只是粘合 expresssocket.io,所以也不要忘记查看 socket.io 的文档。话虽如此,从 socket.io v0.7 开始,我们现在有一个 API 方法来获取此信息:

var clients = io.sockets.clients('room'); // all users from room `room`

不幸的是 express.io 是用 Coffeescript 编写的(UGGGH!!!),所以我很难阅读源代码,但看起来当您需要 express.io 模块时,socket.io 实例也会被提升:

var express = require('express.io');
var clients = express.io.sockets.clients('room'); // all users from room `room`

如果这不起作用,我会放弃 express.io 来使用express和socket.io进行手动配置,因为它看起来express.io有一个非常固执己见的API。它实际上一点也不难,因为 express.io 只是为手动配置创建一个漂亮的界面/抽象(如果上述方法不起作用,那么在这个用例中实际上会伤害你)。

我也会检查 SockJS,因为由于缺乏社区支持,我(和许多其他 websocket 消费者)放弃了 socket.io 而转而使用 SockJS。更不用说,当回退到 xhr-polling 时,IE9 中存在严重的内存泄漏。

关于node.js - Express.io 中的连接客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21683565/

相关文章:

objective-c - 在消息传递应用程序中使用 APN

java - Java 中的客户端服务器 LAN Messenger

node.js - 如何发布我的第一个 Node.js 应用程序?

node.js - 如何获取 Elasticsearch 中搜索次数最多的前 20 个查询?

node.js - 添加多个占位符时快速路由不起作用

javascript - EJS 表单中的 App.post 不起作用 - ExpressJS

java - 连接按钮不起作用

javascript - 需要 Discord.js 机器人帮助 - 如何让我的机器人每 6 小时自动执行一次任务而不向它发送命令?

jquery - 获取多个元素的文本作为单独的值

javascript - node busboy + express 4 + ng-file-upload 不触发事件