我正在使用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 在所有会话中为用户全局存储信息。
conversationData 为单个会话全局存储信息。对话中的每个人都可以看到此数据,因此在将数据存储到此属性时请小心操作。它默认启用,您可以使用bot的persistConversationData设置禁用它。
privateConversationData 为单个会话全局存储信息,但它是特定于当前用户的私有数据。此数据涵盖所有对话框,因此对于存储您希望在会话结束时清理的临时状态非常有用。
dialogData 会保留单个对话框实例的信息。这对于在对话框中的瀑布步骤之间存储临时信息至关重要。
保存状态的实际存储机制/位置是什么?我的意思是,如果我在session.userData
中保存一些数据并在一周之后为同一个用户访问它,我怎么得到相同的数据。实际保存的数据在哪里?
如果我设置persistUserData
& persistConversationData
为假?这是否意味着userData& conversationData不会被保留。如果是,那么它本质上意味着我无法保存数据。不是吗?或者这意味着什么不同?
任何人都可以分享同一个覆盖范围内有多个用户的任何示例吗? 或者说明这些各种数据保存方法的功能(优点和缺点)的例子。
我提到的资源:
https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-state
答案 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
当我查看活动字段时,我的一个测试中的示例:
答案 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保留在对话框中时文档不正确。
那么,这种信息会在哪里? 感谢