Node.js 如何保存MS bot状态数据和对话?

Node.js 如何保存MS bot状态数据和对话?,node.js,botframework,bots,azure-cosmosdb,cortana,Node.js,Botframework,Bots,Azure Cosmosdb,Cortana,我正在使用NodeJS和MicrosoftBotBuilderSDK编写一个机器人程序。目前,我正在将所有内容保存在数据包conversationData、userData等中,并使用CosmosDb存储状态。我根据本文配置了CosmosDB,并根据nodejs进行了更改。 这种方法很少引起关注 当我们在对话中调用endConversation时,对话数据包被清除。这是sdk设计所期望的,但我们希望为具有相同用户相同会话id的多个会话流保留此数据。现在,当用户启动新的意图时,数据库中的json

我正在使用NodeJS和MicrosoftBotBuilderSDK编写一个机器人程序。目前,我正在将所有内容保存在数据包conversationData、userData等中,并使用CosmosDb存储状态。我根据本文配置了CosmosDB,并根据nodejs进行了更改。

这种方法很少引起关注

当我们在对话中调用endConversation时,对话数据包被清除。这是sdk设计所期望的,但我们希望为具有相同用户相同会话id的多个会话流保留此数据。现在,当用户启动新的意图时,数据库中的json cosmosDb将被替换为conversationData上的新键。 例:安排与{name}在{place}举行{day}会议。 我们保存conversationData.name、conversationData.day和conversationData。位置 同一用户开始在{place2}重新安排与{name2}的{day2}会议。 documentDb条目将替换为conversationData.name1、conversationData.day2和conversationData。地点2 理想情况下,我们希望保留一切

有没有更好的方法来保存聊天历史记录&会话数据、用户数据
MS BOT中的数据包?

所有存储实现都只写getData和saveData,它们内部有一个key:value存储,其中key通常是userId+conversationId,但只要您能够可靠地从传递给getData和setData的参数中派生出来,就可以随意创建它

查看redis中的一个示例—这是一个非常容易理解的存储实现示例

您可以使用这样的自定义实现

// Create new storage with redis client
var storage = new YourStorage()

// this is just here for the sake of initializing a `bot`
var connector = new builder.ChatConnector()
var bot = new builder.UniversalBot(connector)

// Configure bot to use YourStorage
bot.set('storage', storage)

bot.set('persistConversationData', true);
存储只是一个实现

public saveData(context: IBotStorageContext, data: IBotStorageData, callback?: (err: Error) => void)

public getData(context: IBotStorageContext, callback: (err: Error, data: IBotStorageData) => void)
我完全只是从链接的redis模块复制了这些签名,但它们在默认存储的BotBuilder源代码中是相同的-


这些样本是用typescript编写的。如果您不熟悉,请忽略:后面的位,它表示事物的类型。

我很困惑。你的意思是覆盖CosmosDb的getData和setData方法,这样我就可以改变会话数据包的行为,一旦会话结束,它就会被清除。我的目标是将会话对象上的所有内容都保存在数据库中。userData.{}是的,或者只滚动您自己的存储实现。它们不需要编写太多的代码,只需要做redis实现所做的事情,除了保存到cosmos或任何你的存储引擎。botbuilder在您提供的任何存储上使用这些方法填充session.userData。session.userData的可搜索键为${userId};调用session.endConversation时,不会清除userDataand。正如Catalyst提到的,您可以更改存储实现。听起来您想生成一个类似@StevenG的新密钥。我很感谢您的反馈,但我想我没有关注如何更改存储实现。您的意思是覆盖saveData和getData方法吗。根据Catalyst的评论,以下是我到目前为止对cosmos所做的工作-var cosmosStorage=设置cosmosStorage;函数setCosmosStorage{var docDbClient=new azure.DocumentDbClient{//connection details.};var cosmosStorage=new azure.AzureBotStorage{gzipData:false},docDbClient;return cosmosStorage;}//用于记录数据库的中间件,记录bot。使用{receive:function event,next{logUserConversationUser,event,event.user.id;next;},send:function event,next{logUserConversationBot,event,event.address.user.id;next;}};var chatHistory=[]const logUserConversation=标识符,event,id=>{chatHistory[event.address.conversation.id]+=event.text;console.log'***BOT/用户消息:'+event.text;};