如何分隔nodejs会话

时间:2017-02-12 12:31:26

标签: node.js session chatbot

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

Session只是服务器上的变量。您可以存储在变量,数组或数据库中(更好的选项,以防服务器重新启动)。所以这完全取决于你的逻辑。

对于每个连接的用户ID,请说明您将拥有其数据。

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

答案 2 :(得分:0)

您需要使用Cookie,会话和会话商店。

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

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

  1. express-sessions
  2. express-session
  3. redis的
  4. 然后以这种方式初始化它......

    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部分。