Botframework NodeJS-首次打开聊天时未定义session.userData

Botframework NodeJS-首次打开聊天时未定义session.userData,botframework,Botframework,当用户第一次打开包含聊天机器人的页面时,我想用他们的名字向他们打招呼。我正在使用聊天机器人作为网络聊天工具。所以我需要像这样的东西:欢迎回来,乔 我实施了以下措施: bot.on('conversationUpdate', function (message) { if (message.membersAdded) { message.membersAdded.forEach(function (identity) { if (identity.i

当用户第一次打开包含聊天机器人的页面时,我想用他们的名字向他们打招呼。我正在使用聊天机器人作为网络聊天工具。所以我需要像这样的东西:欢迎回来,乔

我实施了以下措施:

bot.on('conversationUpdate', function (message) {
    if (message.membersAdded) {
        message.membersAdded.forEach(function (identity) {
            if (identity.id === message.address.bot.id) {
                bot.beginDialog(message.address, 'WelcomeDialog');
            }
        });
    }
});
在WelcomeDialog中,我有这样一句话:

bot.dialog('WelcomeDialog',
    (session) => {
        session.sendTyping();
        if (!session.userData.PreferredName) {
           //write logic to get user preferred name to call him/her with
           session.userData.PreferredName = "new name"
        }

        else if (!session.conversationData.loggedBefore) {
            session.send(`Welcome back ${session.userData.PreferredName}`)
            session.conversationData.loggedBefore = true;
        }

        session.endDialog()
    })
但是,当我在webchat中运行此命令时,session.userData始终为空,即使仅在从conversationUpdate调用的WelcomicDialog中填充它。。但是,如果我调用另一个对话框并尝试检查session.userData,它将包含我添加的值。。所以基本上,当我第一次打开bot时,session.userData总是空的,否则它可以正常工作


此外,它在模拟器中工作良好,只是在webchat中没有。知道如何解决这个问题吗?

这是一个已知的问题。这篇博客文章介绍了一种解决方法:


基本上,它归结为这样一个事实:连接器服务是发送conversationUpdate活动的对象。当conversationUpdate进入bot时,它没有正确的用户ID,因此bot无法构建数据包。如果在BotChat初始化后从客户端发送事件,则该事件将具有正确的用户ID,并且一切都将按预期工作。它在emulator中工作的原因是emulator不使用连接器服务,而是自己发送conversationUpdate。

谢谢。我不知道那件事。在我的例子中,我使用的是bot的Web频道提供的嵌入式代码,它是一个iframe。在你发给我的文章中,他们使用的是客户端JavaScript。。我该怎么做呢?另外,他们正在考虑webchat,如果我也想支持Skype呢?iframed版本根本不支持从“conversationUpdate”加载对话框。而且,Skype不发送“conversationUpdate”,您需要对该频道使用“contactRelationUpdate”。谢谢Eric。所以我需要写代码来处理网络聊天和另一个代码专门为Skype?是的。频道表现不同。MBF尽其所能将所有内容映射到共享活动模式,但并非所有通道都以相同的方式参与。谢谢Eric。我将把它标记为答案。我会尝试一下,并让你知道它是如何进行的,以防我有更多的担心。对于这项技术还是新手,所以感谢您分享您的知识。