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

我正在尝试开发我的第一个节点应用程序..那就是说我有一个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)

2 years ago

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

每个登录用户的模块都有一个队列 . 当用户离开页面(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];
  }
}