Node.js Microsoft Bot Framework:会话间的名称相同

Node.js Microsoft Bot Framework:会话间的名称相同,node.js,session,botframework,azure-language-understanding,Node.js,Session,Botframework,Azure Language Understanding,我有以下代码,试图在聊天过程中设置用户名。例如,如果用户编写消息“嗨,我的名字是Bob”,机器人将通过用他的名字问候用户来响应,但只有当该名字被标记为“名字”实体时 问题在于,该名称是为当前与bot聊天的每个用户全局设置的,而不是仅为当前用户设置的。换句话说,在这种情况下,机器人将呼叫当前正在聊天的每个用户Bob。 var intents = new builder.IntentDialog({ recognizers: [recognizer] }) // Check if the

我有以下代码,试图在聊天过程中设置用户名。例如,如果用户编写消息“嗨,我的名字是Bob”,机器人将通过用他的名字问候用户来响应,但只有当该名字被标记为“名字”实体时


问题在于,该名称是为当前与bot聊天的每个用户全局设置的,而不是仅为当前用户设置的。换句话说,在这种情况下,机器人将呼叫当前正在聊天的每个用户Bob。

var intents = new builder.IntentDialog({ recognizers: [recognizer] })

    // Check if the message user sent matches LUIS intent "greetingsWithName"
    .matches('greetingsWithName', (session, args) => {
        // Attempt to set content of LUIS entity "name" to variable "name" 
        name = builder.EntityRecognizer.findEntity(args.entities, 'navn');

        // Check whether the name was successfully set or not
        if (!name) {
            session.send('Sorry, I didn't catch your name.')');
        } else {
        session.userData.userName = name.entity;
        session.send('Hi, ' + session.userData.userName);
    });
稍后,我将在代码中检查用户是否在会话期间向bot提供了自己的名称。如果是这样,那么用他的名字向用户说再见:

.matches('goodBye', (session) => {
    if (!session.userData.userName) {
        session.send('Good bye!');
    } else {
        session.send('Good bye, ' + session.userData.userName);
    }
})

bot.dialog('/', intents);
以下是启动web聊天会话的文件中的HTML代码:

<!DOCTYPE html>
<html>
  <head>
    <link href="https://cdn.botframework.com/botframework-webchat/latest/botchat.css" rel="stylesheet" />
  </head>
  <body>
    <div id="bot"/>
    <script src="https://cdn.botframework.com/botframework-webchat/latest/botchat.js"></script>
    <script>
      BotChat.App({
        directLine: { secret: direct_line_secret },
        user: { id: 'userid' },
        bot: { id: 'botid' },
        resize: 'detect'
      }, document.getElementById("bot"));
    </script>
  </body>
</html>

BotChat.App({
directLine:{secret:direct\u line\u secret},
用户:{id:'userid'},
bot:{id:'botid'},
调整大小:“检测”
},document.getElementById(“bot”);

您正在将用户名存储在
userData
中,这是符合逻辑的

但在测试仪中,您为每个webchat用户设置了相同的用户id:

user: { id: 'userid' }
因此,每个用户都将指向相同的
userData
,因为键是频道名称和用户id的组合(
activity.ChannelId
activity.From.id
,在C#中)

您可以通过为每个webchat用户生成唯一标识符来避免这种情况,例如使用

在这种情况下,
user:{id:uuid()}


此外,如果您需要设置显示名称,请将
名称:'…'
添加到用户的定义中:
用户:{id:uuid(),名称:'you'}

“问题是,名称是为当前与bot聊天的每个用户全局设置的,而不是仅为当前用户设置的”:您在哪个频道上看到此行为?Emulator?@NicolasR位于一个本地HTML文件中,该文件使用通过DirectLine通道启动bot。我尝试在其他具有不同IP/连接到不同网络的设备上传递HTML文件,但问题仍然存在。好吧,我想您的HTML中的webchat中总是有相同的用户Id?这就可以解释问题了。。。你能添加这个html文件的代码吗?@NicolasR啊,事实上可能就是这样。我用了这个。在主菜单中添加了HTML代码post@NicolasR
user:{id:'userid'}
字段当前设置为
user:{id:'You'}
通过创建生成随机用户id的函数并将其传递到
user:{id:createUserId()}
,bot能够区分会话。非常感谢。有许多解决方案可以更改Id是的,主要的事实是在交叉调用时使用了相同的user.Id。很高兴这有帮助