【发布时间】:2015-12-22 00:24:26
【问题描述】:
我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都在单个服务器上运行,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器向特定客户端发送带有一些数据的事件。
套接字服务器在 8081 端口上运行,而 REST 在 8080 上。
这个想法是客户端进行操作(POST 请求),该操作记录在“操作历史记录”表中。该操作涉及其他用户,因此应在发生这种情况时实时通知他们。这就是其他用户监听 websocket 连接的原因。
如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?
我当时想了三个办法:
- 使用 RabbitMQ 为套接字和休息和通信分离服务器
-
我尝试实现Socket.IO-Emitter,但它需要 Redis 数据库(我仍然不知道为什么)。当我尝试使用发射器从 HapiJS 路由处理程序连接到套接字时,我得到:
export function* postRefreshEvent(userId) { var connection = require('socket.io-emitter')({ host: '127.0.0.1', port: 8081 }); connection.in('UserHistory').emit('refresh', userId); return {statusCode: OK} } Error: Ready check failed: Redis connection gone from end event.在 RedisClient.on_info_cmd
在 Socket 服务器中不执行刷新。我只是没有看到显示的日志。
- 创建一个特殊事件并使用普通 socket.io 客户端从 hapijs 连接到 websockets 并在那里发出新事件。
一个样本GIST。
你有想过这样的事情吗?我感谢每一个帮助!
【问题讨论】:
-
听起来你有点把事情复杂化了。如果这一切都在一台服务器上,为什么不直接调用一个函数或发出一个 EventEmitter 事件呢?在这种情况下不需要引入消息队列之类的东西。
-
你是对的。很好的解决方案! :) 非常感谢!
-
嗨@NMP,你最后用的是哪一个?马特方法或使用
@hapi/nes作为西蒙的答案?
标签: node.js rest sockets hapijs socket.io-1.0