2017-02-12 63 views
0

我有一个非常简单的nodejs聊天机器人,它可以了解有关与之连接的客户机的信息。例如,如果客户说“我的名字是鲍勃”,然后询问chatbot“我的名字是什么?”聊天机器人会说“Bob”,问题是如果另一个客户机连接到服务器,然后询问chatbot同一个问题,聊天机器人也会回复“Bob”。我知道我需要实施一些处理会话的方式,但是我在网上找到的有关会话的一切都是为了解释有关cookie以及如何存储用户身份验证的内容。如何分离nodejs会话

我想要做的就是让每个客户都有自己的服务器实例,该服务器对其他客户端一无所知。

回答

0

会话只是服务器上的变量。你可以存储变量,数组或数据库(在服务器重启时更好的选择)。所以完全取决于你的逻辑。

让我们说,对于每个连接的用户ID,您将获得其数据。

var userData = {1: {username: "bob" }, 2: {username: "alice", ... }} 
1

您可以使用内存数据库(如Redis)通过标识其ID来存储关于连接用户的信息。假设你正在为你的机器人使用Messenger平台。您从Facebook接收到的每条消息都会附带一些信息,例如发送消息的用户标识,发送消息的页面标识等。然后,您可以使用Redis存储有关任何用户(userID,userName等)。一旦收到消息,您只需使用其ID作为密钥来查询有关用户的信息。

0

您需要使用cookie,会话和会话存储。

如果您使用适当的会话库,它将自动为客户端上的用户和服务器上的会话创建cookie。 在浏览器上,只有sessionID存储在cookie中的服务器上,您可以根据需要添加任意数量的属性。坚持他们,你可以使用Redis。

使用这三个库的组合(注意到的第一和第二实际上是不同的):

  1. 明确的会话
  2. 快递会话
  3. Redis的

那么你的初始化它以这种方式...

var redis = require('redis'); 
var client = redis.createClient(); 
var crypto = require('crypto'); 
var session = require('express-session'); 

app.use(session({ 
    secret: 'A-SECRET-NOBODY-KNOWS', 
    resave: false, 
    saveUninitialized: true, 
    genid: (req) => { 
      return crypto.randomBytes(16).toString('hex');; 
      }, 
    store: new (require('express-sessions'))({ 
     storage: 'redis', 
     instance: client, // optional 
     collection: 'sessions' // optional 
    }) 
})); 

最后使用的会话是简单地

//read 
let token = req.session.token 

//write 
req.session.token= 'A very secret token'; 

我写了一个tutorial有关于如何使用会话,向下滚动到部分更多信息6.