node.js - Botframework v4 在部署后保留 dialogSet
问题描述
我正在使用 Microsoft bot 框架 v4。它的 DialogSet 始终保存在内存中,并且在代码重建(即部署)后会消失,因此恰好在重建之前的对话框中的现有对话,在部署完成后会出错(找不到所需的对话框)。
export class DialogBot extends ActivityHandler {
private readonly conversationState: BotState;
private readonly userState: BotState;
private readonly dialogState: StatePropertyAccessor<DialogState>;
private readonly nlpProcessor: NlpProcessor;
private readonly dialogSet: DialogSet;
private readonly cacheService: CacheService;
private readonly mainProcessor: MainProcessors;
constructor(conversationState: BotState, userState: BotState) {
super();
this.conversationState = conversationState;
this.userState = userState;
this.dialogState = this.conversationState.createProperty<DialogState>(
'DialogState'
);
this.dialogSet = new DialogSet(this.dialogState);
您可以看到 dialogSet 在部署后总是启动新的
this.dialogSet = new DialogSet(this.dialogState);
虽然 dialogStack 被持久化到 dialogState 中,但它的 dialogs 数组不是
export class DialogSet {
private readonly dialogs: { [id: string]: Dialog } = {};
private readonly dialogState: StatePropertyAccessor<DialogState>;
private _telemetryClient: BotTelemetryClient;
private _version: string;
dialogs 数组只存在于内存中,其中包含堆栈引用的各个 Dialog 对象。一旦你重建代码,它就消失了。
我尝试扩展 DialogSet 类,并将其 dialogs 属性保存到 Blob 存储,但是,Blob 仅记录 json,并且没有正确重建 dialogs 数组(其中包含所有 Dialog 对象)。
任何人都有通过部署保留 DialogSet 状态的解决方案?提前谢谢了。
解决方案
对话集是静态的,与状态无关。对话集表示您的机器人可能开始的一组对话,而不是您的机器人在特定对话中实际开始的对话。每次您的机器人运行时,对话框集都应该相同,并且不应更改。以对话状态存储的对话堆栈是根据特定对话而变化的东西。
您应该始终在启动时将所有可能的对话添加到对话集中。这就是所有 Bot Framework 对话框的工作方式,任何不这样做的机器人都会被破坏。您可以在每个官方示例中看到这种模式(注意内部ComponentDialog.addDialog
调用DialogSet.add
)。没有在构建时未添加的对话框被调用。这可确保您的机器人在重新启动后工作。
推荐阅读
- swift - 小部件不断在设备屏幕上重新加载
- android - android 5 和 5.1 中的矢量可绘制资源未找到错误
- java - 如何显示输入数字(质数)的 2 位总和
- python - Discord.py 特权意图停止 on_message 和命令工作
- python - 根据 Pandas 数据框列中的值创建包含指定范围的新列
- html - 从本地磁盘到本地磁盘的跨源错误(仅限基本 HTML,不是 AJAX)
- django - Django 序列化程序过滤外键
- android - Android,通过 Sharesheet 共享自定义数据?
- haskell - 如何使用通用用法自动生成此类实例?
- c# - 如何将 COM 返回的对象的接口“替换”为托管代码?