Socket.IO 和 HapiJS 之间的连接
Connection between Socket.IO and HapiJS
我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都 运行 在单个服务器上,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器将带有一些数据的事件发送到特定客户端。
套接字服务器 运行 在端口 8081 上,REST 在 8080 上。
这个想法是客户端执行一个操作(POST 请求),该操作记录在 "Actions History" table 中。该操作涉及其他用户,因此当发生这种情况时应实时通知他们。这就是其他用户正在监听 websocket 连接的原因。
我如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?
我当时想了3个办法:
- 使用 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.
你有想过这样的事情吗?感谢您的帮助!
您可以尝试使用 https://github.com/hapijs/nes,它通过插件将 websockets 集成到 hapi 中。免责声明我之前没有尝试过或使用过 websockets,但它似乎很好地融入了 hapi
.
您可以只使用普通的旧 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 向 http://localhost:4000/action
发出请求(curl http://localhost:4000/action ),您会看到事件出现在 Web 控制台中:
我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都 运行 在单个服务器上,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器将带有一些数据的事件发送到特定客户端。
套接字服务器 运行 在端口 8081 上,REST 在 8080 上。
这个想法是客户端执行一个操作(POST 请求),该操作记录在 "Actions History" table 中。该操作涉及其他用户,因此当发生这种情况时应实时通知他们。这就是其他用户正在监听 websocket 连接的原因。
我如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?
我当时想了3个办法:
- 使用 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.
你有想过这样的事情吗?感谢您的帮助!
您可以尝试使用 https://github.com/hapijs/nes,它通过插件将 websockets 集成到 hapi 中。免责声明我之前没有尝试过或使用过 websockets,但它似乎很好地融入了 hapi .
您可以只使用普通的旧 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 向 http://localhost:4000/action
发出请求(curl http://localhost:4000/action ),您会看到事件出现在 Web 控制台中: