MS Bot框架中可用的状态保存方法混淆

时间:2017-12-13 11:50:22

标签: node.js botframework

我正在使用Node.JS中的MS Bot框架开发机器人。我正在阅读有关使用bot保存/检索用户对话状态的各种方法的文档。

根据我的理解,对于每个机器人,每个用户都是不同的对话。对于例如我有两个机器人,BOT-A& BOT-B。并且具有skype ID abc.skype的用户访问这些机器人。该用户将使用不同的conversationID&每个机器人的userID。即对于BOT-A,用户的conversationID将是'ABC'&对于BOT-B,conversationID将是'XYZ'。会话对象中的userID字段将保存可识别用户的数据,例如用户在频道中公开显示的名称。

根据文件(saving-state

  

userData 在所有会话中为用户全局存储信息。

  1. 全球的意思是什么?
  2. 所有对话的含义是什么?
  3.   

    conversationData 为单个会话全局存储信息。对话中的每个人都可以看到此数据,因此在将数据存储到此属性时请小心操作。它默认启用,您可以使用bot的persistConversationData设置禁用它。

    1. 单次对话是什么意思?
    2. 每个人都可以看到哪些数据?如何看到数据 每个人,当它是决定的机器人时,发送的响应是什么 回复或每个用户消息?每个人都是谁?
    3.   

      privateConversationData 为单个会话全局存储信息,但它是特定于当前用户的私有数据。此数据涵盖所有对话框,因此对于存储您希望在会话结束时清理的临时状态非常有用。

           

      dialogData 会保留单个对话框实例的信息。这对于在对话框中的瀑布步骤之间存储临时信息至关重要。

      保存状态的实际存储机制/位置是什么?我的意思是,如果我在session.userData中保存一些数据并在一周之后为同一个用户访问它,我怎么得到相同的数据。实际保存的数据在哪里?

      如果我设置persistUserData& persistConversationData为假?这是否意味着userData& conversationData不会被保留。如果是,那么它本质上意味着我无法保存数据。不是吗?或者这意味着什么不同?

      任何人都可以分享同一个覆盖范围内有多个用户的任何示例吗? 或者说明这些各种数据保存方法的功能(优点和缺点)的例子。

      我提到的资源:

      https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-state

2 个答案:

答案 0 :(得分:1)

我理解这些概念的混合,当你没有尝试过几个频道并查看所有消息字段时,它有点难以管理!

关于您的初始陈述的一些观点:

  

将使用不同的conversationID& amp;用户身份   为每个机器人

这不完全正确:

  • UserId:对于某些频道,userId对于不同的机器人可以是相同的,例如其中userId是phoneNumber的SMS。对于其他人来说,它在像Messenger这样的机器人之间进行了更改,其中userId是一个Page-Scoped ID。
  • ConversationId:是的,您不能在2个单独的机器人中为2个用户提供相同的conversationId。但是在某些频道中,您也会为同一个用户提供多个conversationId。 在某些通道中,机器人可以进行群组对话,对于每个用户,conversationId都是相同的。
  

会话对象中的userID字段将保存可识别的数据   用户,例如用户在频道中公开显示的名称。

它的User字段,包含Id(用户密钥)和Name(公开可见名称)。

然后问你的问题:

  

userData 为所有用户全局存储信息   会话。

对于某个频道,

userData在特定UserId的所有会话之间保持一致!它不是跨渠道的,因为没有Id是跨渠道

  

conversationData 全局存储单个信息   会话。对话中的每个人都可以看到此数据   所以在将数据存储到此属性时请小心操作。它启用了   默认情况下,您可以使用机器人禁用它   persistConversationData设置。

正如我所说,在某个频道中,机器人可以进行群组对话,因此每个用户的conversationId都是相同的,对话中的每个用户对话数据内的信息都是相同的

如果您想在此对话中保留有关特定用户的信息,请使用privateConversationData(或userData,如果必须保留的次数超过此对话)。

我认为文档清楚地说明了在哪里做的事情:

  

这四个属性对应于四个数据存储容器   可用于存储数据。您用于存储数据的属性   将取决于您存储的数据的适当范围,   您正在存储的数据的性质,以及您想要的时间   数据持续存在。例如,如果您需要存储将要的用户数据   可以在多个对话中使用,请考虑使用   userData属性。如果需要临时存储局部变量   在对话框范围内的值,请考虑使用dialogData   属性。如果您需要临时存储必须的数据   可以跨多个对话框访问,考虑使用   conversationData属性。

  

保存状态的实际存储机制/位置是什么?通过这个我   意味着如果我在session.userData中保存一些数据并在之后访问它   同一个用户一周,我怎么得到相同的数据。哪里是   实际保存的数据?

如果您在同一个频道并获得相同的userId,则会获得相同的数据。

提供了一个用于测试的存储(托管在Bot连接器中?),但它不是用于生产而已弃用。对于数据的位置,您必须使用CosmosDB或TableStorage实现自己的存储:https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-state

  

如果我设置persistUserData& persistConversationData to   假?这是否意味着userData& conversationData不会   持续存在。

是的,在谈话结束时没有坚持。

  

如果是,那么它本质上意味着我无法保存数据。   不是吗?或者这意味着什么不同?

不,这意味着您无法在通话结束后再次获取此数据。

  

任何人都可以共享任何有多个用户的例子   对话?或者一个展示能力的例子(专业版和专业版)   ()这些各种数据保存方法。

=>例如Slack通道,机器人部署在"频道" (不要在私人DM中与机器人交谈)!

您将看到ConversationId看起来像Bxxxxxxxx:Txxxxxxxx:Cxxxxxxxx,其中Bxxxxxxxx是您机器人的Slack ID,Txxxxxxxx是您的Slack的团队ID,Cxxxxxxxx是您当前的频道Slack&#39 ; s ID

当我查看活动字段时,我的一个测试中的示例:

  • Conversation.Id = Bxxxxxxxx:Txxxxxxxx:Cxxxxxxxx,
  • Conversation.Name = general,(我使用机器人的Slack&#39频道的名称)
  • From.Id = Uxxxxxxxx:Txxxxxxxx,(我的Slack的用户ID)
  • From.Name = nicolas,(我的Slack&#39用户名)
  • Recipient.Id = Bxxxxxxxx:Txxxxxxxx,(我的机器人的Slack&#39)
  • Recipient.Name = myBotName(我的机器人的Slack')

答案 1 :(得分:0)

我有一个像这样的寻呼机模块。

var Paginator = function (items, limitItems) {
    this.currentPage = 1;
    this.nextPage = this.currentPage + 1;
    this.totalPage = Math.ceil(items.length / limitItems);
    this.count = 0;
    this.delimiter = this.count + limitItems;
    this.limitItems = limitItems;
}
Paginator.prototype.getItems = function (items) {
// My code
}
module.exports = Paginator;

我将寻呼机存储在 session.dialogData.paginator 中。 从理论上讲,这个区域在瀑布的下一步应保持不变,但事实并非如此。 通过builder.Prompts.confirm后, Paginator.prototype.getItems 方法丢失。 我断定说明session.dialogData保留在对话框中时文档不正确。

那么,这种信息会在哪里? 感谢