- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都在一个服务器上运行,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器将带有一些数据的事件发送到特定客户端。
套接字服务器在端口 8081 上运行,REST 在 8080 上。
这个想法是客户端执行一个操作(POST 请求),该操作记录在“操作历史记录”表中。该操作涉及其他用户,因此当发生这种情况时应实时通知他们。这就是其他用户监听 websocket 连接的原因。
我如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?
我当时想了3种方法:
我尝试执行 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 服务器不执行刷新。我只是没有看到显示的日志。
样本 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),您将看到事件出现在网络控制台中:
关于node.js - Socket.IO 与 HapiJS 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760678/
我正在查看 hapi 路由的一些身份验证配置选项。我了解范围的工作原理 - 您可以将路由的范围设置为 'admin'这意味着用户的凭据必须具有匹配的范围...但是 entity 的目的是什么? ? 以
我正在使用 lab 编写测试用例我想测试我的插件是否抛出异常。问题是,hapi 允许异常冒泡,同时还设置了对内部服务器错误 500 的响应,这导致我的测试失败。 我们可以测试这个响应 expect(r
在 express 中,我有这样的事情: router.get('/foo', middlewareFunction, function (req, res) { res.send('YoYo
此代码在版本 9.0.3 中不起作用: server.route({ method: 'GET', path: '/', handler: function() {
我在 Joi 验证方面遇到了一个问题(或者我认为是一个问题)。如果它作为请求正文的一部分传递,我正在尝试为不存在的键分配一个值。 例如: parameters: Joi.object().keys({
由于“Inert”插件现在必须单独加载。我想注册我的应用程序的路线。我有2个选择 1) 导出一个以“server”为参数的函数,并将代码编写为 module.exports = function(se
我应该如何使用 HapiJS 实现类似 PHP exec 的系统函数调用?用户提交一个需要在后台运行一段时间的处理作业。 我需要以某种方式向用户返回作业ID/ session ID,异步运行作业,允许
我有一个像这样的routes.js: server.route({ method: 'GET', path: '/marvel/universal/verify/{serial?}',
我执行一些循环时内存不足。我怀疑 HapiJS 正在某种受限模式下运行。 我的开发机器有 i7 和 8GB 内存,但在 Hapi 控制台中我从未看到 Hapi 使用超过 1GB。 如何确保 Hapi
我使用 Joi 库作为我的 CRA 项目的独立验证器,但在触发时 email()验证器我收到神秘错误 Uncaught Error: Built-in TLD list disabled 最佳答案 来
有没有办法访问全局注册的插件?我已阅读有关 hapi-sequelize 的内容,我想将其实现到我的 hapi 应用程序中。这是documentation 。它指出您可以使用以下代码全局访问它: va
所以我有 Hapi (v17.5.1),当我有我的插件数组时 [ { plugin: good, options: { reporters: { errorReporte
我觉得我缺少一些基本的东西,但我不知道如何在 HapiJS 中获得更好的控制台输出。 我正在编写一个 API,当出现错误时它会打印出来。 150516/063815.663, [response],
我对 Hapi 如何处理验证感到有点困惑,根据请求生命周期 ( http://hapijs.com/api#request-lifecycle ),参数/查询的验证仅在身份验证完成后发生。 这样做有意
我有一个返回结果的代码。通常,当我收到该结果时,我会将其发送给客户端,并在此过程中将其转换为纯 JSON 对象。 但现在我需要对该结果集进行一些操作,然后在数据库中进行另一次查找。 我不明白的是结果集
我目前正在使用 hapi,我遇到了一个问题,我似乎找不到任何解决方案或以前提到过。当我发送以下请求时,只有我的第一个查询参数在 request.query 对象中。 curl -H "Content-
我想验证一个字段并允许另一个字段而无需验证;通过示例只是为了验证:“名字”字段。在我的代码中,当我注释“有效载荷”时,hapi 允许我记录任何字段,当我取消注释“有效载荷”时,hapijs 不允许我记
我一直在研究 hapi.js 应用程序并具有以下架构: Database --Models --usermodel.js --anothermodel.js Routes --
有谁知道是什么意思? npm ERR! Test failed. See above for more details. 3 tests complete Test duration: 873 ms
在 hapi.js API 中,他们指定身份验证方案也可以将工件作为凭证对象的一部分返回。 究竟什么是身份验证工件,它们为什么有用?有没有一个很好的例子来说明为什么 hapi 团队将此作为其 API
我是一名优秀的程序员,十分优秀!