【问题标题】:Server-created events using Node JS使用 Node JS 的服务器创建的事件
【发布时间】:2014-05-29 02:20:56
【问题描述】:

我们在 Ubuntu 12.04 的堆栈中使用 node js、redis、php 和 mysql。 这是一个内部应用程序,我们正在努力让实时通知正常工作。

有很多代码,让我确切地知道你想看哪些部分 - 我会发布它们。

这是我所在的位置: 每当用户登录时,都会触发节点索引文件 (app.js) 并将用户的 id、会话 id、套接字 id 和其他几个变量放入一个对象中并使用 redis-server 作为活动连接的数据存储。当客户端注销或关闭浏览器时,连接将从数据存储中删除。这是 & 一直在相应地发挥作用。

问题出在: Cron 调用:

/var/www/node node notifications.js 

Notifications.js 进行 sql 查询,然后需要发送任何等待的未决消息。 Notifications.js 可以访问 redis 并获取存储的客户端 websocket 连接信息。 所以此时,我有要发送的消息、用户的 id、(php) 会话 id 和 WebSocket ID。

我无法将消息发送回客户端,因为 socket.io ws 连接对象没有连接。

我已经在应用中导出了对象

/* Include Default & Mandatory Modules */
var http            =       require('http')
, server            =       http.createServer().listen(3000)
, socketio          =       require('socket.io')
, socketioWildcard  =       require( 'socket.io-wildcard' )
, io                =       socketioWildcard( socketio ).listen(server)
, redis             =       require('redis')
, rclient           =       redis.createClient()
, util              =       require('util');

/* Export to other modules */
exports.socketio    =       io.sockets;

在其他节点库中,由浏览器事件调用/触发 - 我可以简单地

require(./app.js);

并像这样使用:

app.socketio.sockets[ app.socket_id ].emit('log.user.out',{'err':true,'msg':'You have been logged ....'});

当我有适当的 WebSocket ID 但浏览器没有创建事件时,我需要在 Notification.js 模块中进行哪些更改才能将事件发送到浏览器?

感谢大家的帮助。

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    使用 Redis 作为消息队列,在程序之间发送消息(事件)。

    1) 创建redis客户端

    var redis = require("redis"),
        client = redis.createClient();
    

    2) notification.js 将事件发布到队列中。

    var msg = {};//your message, user id, session id, websocket id
    client.publish("socket_message", JSON.stringify(msg, null, 4));
    

    3) app.js 订阅频道

    client.subscribe("socket_message");
    client.on("message", function(channel, msg) {
      var message = JSON.parse(msg);
      //send any socket.io message to client there
    });
    

    【讨论】:

    • 我已经阅读了有关 pub/sub 系统的信息——我还没有被它们弄湿。这看起来是我的问题的一个很好的解决方案。我今天正在实施,明天会有反馈。谢谢尼古拉!
    猜你喜欢
    • 2015-03-01
    • 2013-09-05
    • 1970-01-01
    • 2021-12-13
    • 2018-07-28
    • 1970-01-01
    • 2021-10-29
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多