node.js - Socket.IO 与 HapiJS 的连接

标签 node.js rest sockets hapi.js socket.io-1.0

我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都在一个服务器上运行,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器将带有一些数据的事件发送到特定客户端。

套接字服务器在端口 8081 上运行,REST 在 8080 上。

这个想法是客户端执行一个操作(POST 请求),该操作记录在“操作历史记录”表中。该操作涉及其他用户,因此当发生这种情况时应实时通知他们。这就是其他用户监听 websocket 连接的原因。

我如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?

我当时想了3种方法:

  1. 使用 RabbitMQ 进行套接字和休息的独立服务器
  2. 我尝试执行 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 服务器不执行刷新。我只是没有看到显示的日志。

  1. 制作一个特殊事件并使用普通的 socket.io 客户端从 hapijs 连接到 websockets 并在那里发出新事件。

样本 GIST .

你想过这样的事情吗?感谢您的帮助!

最佳答案

您可以只使用普通的旧 EventEmitter 在代码库的 socket.io 和 hapi 部分之间进行通信。这是一个有效的示例,并说明了如何执行此操作:

var Hapi = require('hapi');

// Make an event emitter for managing communication
// between hapi and socket.io code

var EventEmitter = require('events');
var notifier = new EventEmitter();

// Setup API + WS server with hapi

var server = new Hapi.Server();
server.register(require('inert'), function () {});

server.connection({ port: 4000, labels: ['api'] });
server.connection({ port: 4001, labels: ['ws'] });

var apiServer = server.select('api');
var wsServer = server.select('ws');

apiServer.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {

        reply.file('index.html');
    }
});

apiServer.route({
    method: 'GET',
    path: '/action',
    handler: function (request, reply) {

        notifier.emit('action', { time: Date.now() });
        reply('ok');
    }
});

// Setup websocket stuff

var io = require('socket.io')(wsServer.listener);

io.on('connection', function (socket) {

    // Subscribe this socket to `action` events

    notifier.on('action', function (action) {
        socket.emit('action', action);
    });
});

server.start(function () {
    console.log('Server started');
});

这是客户端的基本 index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://localhost:4001/socket.io/socket.io.js"></script>
</head>
<body>
    <script>
    var socket = io('http://localhost:4001');
    socket.on('action', function (action) {
        console.log(action);
    });
    </script>
</body>
</html>

如果你运行它并浏览到 http://localhost:4000 并打开你的控制台,你就可以向 http://localhost:4000/action 发出请求> 使用浏览器或使用 cURL (curl http://localhost:4000/action),您将看到事件出现在网络控制台中:

enter image description here

关于node.js - Socket.IO 与 HapiJS 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760678/

相关文章:

c++ - 连接错误 : Invalid argument at sockets

java - 在套接字上发送和接收文件

node.js - 为基于 create-react-app 的项目运行 npm build 后在运行时读取环境变量

javascript - 需要在 ng-template 中解释 let-* 指令

node.js - 任务计划管理

php - Slim PHP REST API 不在生产服务器中获取数据,在本地主机中工作

rest - 是否在自定义 HTTP header RESTful 中传递租户?

node.js - 对电视的网络请求可从除 Raspberry Pi 以外的任何设备运行

json - Jmeter:重用和更改 Json 响应作为下一个请求的正文

c - 如果启用环回,为什么发件人没有收到其多播 UDP 数据包?