You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js的Bot Framework对话数据Azure存储表存储咨询

将Bot对话内容存储到Azure存储表的实现方案

问题背景

你已经搞定了Bot的基础通信功能,能打日志也创建了dataBT表,现在想把用户和Bot的对话存到Azure存储账户里,基于你提供的代码片段来扩展实现:

var restify = require('restify'); 
var builder = require('botbuilder'); 
var botbuilder_azure = require("botbuilder-azure"); 
var server = restify.createServer...

实现步骤

其实利用你已经引入的botbuilder-azure包就能轻松搞定,我给你一步步拆解:

1. 准备Azure存储连接信息

首先去Azure门户找到你的存储账户,在「访问密钥」里复制连接字符串——这是Bot和存储账户通信的核心凭证,注意不要泄露。

2. 初始化Azure表存储客户端

在你的代码里添加存储配置和客户端初始化,关联上你已经创建的dataBT表:

// 配置Azure存储连接(替换成你的真实连接字符串)
const storageConfig = {
    storageAccountOrConnectionString: "你的Azure存储账户连接字符串",
    tableName: "dataBT" // 你已创建的目标表名
};

// 创建表存储操作客户端
const tableStorage = new botbuilder_azure.AzureTableStorage(storageConfig);

3. 用中间件捕获并保存对话消息

Bot Builder的中间件可以拦截消息收发的全流程,刚好用来自动保存对话内容。添加一个自定义中间件,分别捕获用户发送的消息和Bot回复的消息:

// 自定义中间件:自动捕获并保存对话内容
bot.use({
    // 处理用户发送给Bot的消息
    receive: function (context, next) {
        if (context.activity.type === 'message' && context.activity.text) {
            // 构造要存储的对话记录
            const userMsgRecord = {
                PartitionKey: `User_${context.activity.from.id}`, // 用用户ID做分区键,方便按用户批量查询
                RowKey: `${new Date().toISOString().replace(/[:.]/g, '-')}`, // 时间戳转合法行键(表存储不允许:和.)
                UserId: context.activity.from.id,
                UserName: context.activity.from.name || '匿名用户',
                BotId: context.activity.recipient.id,
                BotName: context.activity.recipient.name,
                MessageText: context.activity.text,
                MessageType: 'UserMessage',
                Timestamp: new Date().toISOString()
            };
            
            // 插入到Azure表存储
            tableStorage.insert(userMsgRecord)
                .then(() => console.log(`已保存用户[${userMsgRecord.UserName}]的消息`))
                .catch(err => console.error("保存用户消息失败:", err));
        }
        next(); // 继续流转消息到后续处理逻辑
    },
    // 处理Bot发送给用户的消息
    send: function (context, next) {
        if (context.activity.type === 'message' && context.activity.text) {
            const botMsgRecord = {
                PartitionKey: `User_${context.activity.recipient.id}`, // 关联接收消息的用户ID
                RowKey: `${new Date().toISOString().replace(/[:.]/g, '-')}_bot`, // 加_bot后缀区分Bot消息
                UserId: context.activity.recipient.id,
                UserName: context.activity.recipient.name || '匿名用户',
                BotId: context.activity.from.id,
                BotName: context.activity.from.name,
                MessageText: context.activity.text,
                MessageType: 'BotMessage',
                Timestamp: new Date().toISOString()
            };
            
            tableStorage.insert(botMsgRecord)
                .then(() => console.log(`已保存Bot回复的消息`))
                .catch(err => console.error("保存Bot消息失败:", err));
        }
        next(); // 继续发送消息给用户
    }
});

4. 验证效果

启动Bot后和它聊几句,然后去Azure门户的存储账户→表存储→dataBT表里查看,就能看到每条对话的完整记录了。

额外注意事项

  • 分区键/行键设计:用用户ID做分区键可以让同一用户的对话存在同一个分区里,后续查询效率更高;行键用时间戳确保唯一,避免重复插入冲突。
  • 错误处理:生产环境建议加重试逻辑,比如用async-retry包处理存储操作的偶发失败,避免关键对话消息丢失。
  • 扩展字段:你可以根据需求给记录加字段,比如ConversationId(会话ID)、Channel(对话渠道,比如Teams/WebChat)等。

内容的提问来源于stack exchange,提问作者GuessssMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:14:31