我们有一个用hapijs实现的rest服务器和一个用socket.io实现的websockets服务器(它们都在一个服务器上运行,但是在不同的端口上)。我想从hapijs服务器通知websockets服务器,将带有一些数据的事件发送到特定的客户机。
socket服务器在端口8081上运行,其余的在8080上。
其思想是客户机执行一个动作(post请求),该动作记录在“动作历史”表中。该操作与其他用户有关,因此在实时发生这种情况时应通知他们。这就是其他用户监听websocket连接的原因。
如何告诉sockets服务器向特定客户机发出事件,并且应该从rest服务器发出事件?
我当时想了三个办法:
使用rabbitmq为套接字、rest和通信分离服务器
我试图实现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.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并打开控制台,则可以使用浏览器或curl(curlhttp://localhost:4000/action)向http://localhost:4000/action发出请求,您将在Web控制台中看到事件:
node.js - Socket.IO和HapiJS之间的连接-LMLPHP

08-07 15:59