首页 文章

使用带有redis的节点和套接字将数据从c#app推送到Web界面

提问于
浏览
0

我正在尝试开发我的第一个节点应用程序..那就是说我有一个C#应用程序通过POST将一个用户特定的json数据提交到一个url让我们称之为 //localhost/data/send ,这个数据将每隔~1-5秒发送一次(还没决定) .

然后,我将有一个网站,要求用户登录,然后轮询该用户数据并显示它 . 我现在不是每隔x秒刷新一次页面,而是认为我可以使用某种套接字或基于事件的技术,如socket.io或redis pub / sub,将数据推送到连接的客户端 .

但是接下来,我该如何确保两件事:

  • 已连接的用户只能访问其信息

  • 我目前正在使用快递,但那可以打开任何真正的..

  • 仅当用户登录到远程Web界面时才会发送数据

我的思维过程是,当用户登录到桌面c#app时,它开始轮询以检查用户是否/何时登录到web界面 .

用户登录Web界面后,桌面应用会根据桌面应用和Web应用之间匹配的用户名识别会话ID . 然后它开始仅推送到该会话ID .

redis甚至需要吗?或者我可以使用一个简单的mysql表和socket.io?

一旦用户注销,数据就不需要是持久的 .

1 回答

  • 1

    如果数据不需要持久化,并且这是一个内部简单的应用程序,用户很少,那么我将创建一个模块,其中包含一个队列和方法来添加和删除队列中的项目 .

    每个登录用户的模块都有一个队列 . 当用户离开页面(onunload)时,您将其注销并删除该用户的队列 . 当您调用c#app调用添加事件时,队列将不存在,这意味着用户未登录 . 当用户登录时,您将为该用户创建队列 .

    请参阅此处了解如何在快递中执行身份验证 . How to do authentication with Node.js, Express and Mongoose?

    像这样的东西:

    var queue = {};
    
    exports.queueEvent = function(user, event){
      if(queue[user]){
        queue[userid].push(event);
      }
      else{
        return 'user not logged in, come back later';
      }
    };
    
    exports.getEvent = function(user){
      if(!queue[user]){
        queue[user] = [];  // this indicates the user is logged in.
        return null; // no events yet.
      }
      return queue[user.shift();
    }
    
    exports.logOutUser = function(user){
      if(queue[user]){
        delete queue[user];
      }
    }
    

相关问题