Node.js中Microsoft Bot Framework自适应卡片提交文本值为空的解决方法
解决方案
不推荐使用外部文件存储
直接读写外部文件会引发多会话并发冲突,且无法实现会话隔离,极易取错数据,生产环境绝对禁用。
推荐的三种赋值方法
1. 自适应卡片隐藏字段嵌入
这是最直接的方案,将捕获到的聊天文本嵌入卡片的隐藏输入字段,提交时随表单数据一起返回:
// 捕获用户聊天文本 const userMessage = turnContext.activity.text; // 构造带隐藏字段的自适应卡片 const adaptiveCard = { type: "AdaptiveCard", version: "1.0", body: [ // 你的卡片展示内容 { type: "Input.Text", id: "hiddenQues", value: userMessage, isVisible: false } ], actions: [{ type: "Action.Submit", title: "提交" }] }; // 发送卡片 await turnContext.sendActivity({ attachments: [CardFactory.adaptiveCard(adaptiveCard)] }); // 处理卡片提交 if (turnContext.activity.type === ActivityTypes.Message && turnContext.activity.value) { const ques = turnContext.activity.value.hiddenQues; // 此处ques即为用户之前的聊天文本 }
2. 会话状态存储(推荐生产环境)
利用Bot Framework内置的会话状态(Conversation State)存储文本,实现会话隔离,跨轮对话也能读取:
// 提前配置会话状态与数据访问器 const conversationState = new ConversationState(new MemoryStorage()); const userQuesAccessor = conversationState.createProperty('userQuestion'); // 捕获用户消息时存入状态 async function onMessage(turnContext) { const userMessage = turnContext.activity.text; await userQuesAccessor.set(turnContext, userMessage); // 发送自适应卡片 await turnContext.sendActivity({ attachments: [CardFactory.adaptiveCard(yourAdaptiveCard)] }); await conversationState.saveChanges(turnContext); } // 处理卡片提交时读取状态 async function onMessage(turnContext) { if (turnContext.activity.value) { const ques = await userQuesAccessor.get(turnContext); // 使用ques数据 } }
3. 内存缓存(仅开发测试用)
单实例开发阶段可临时用全局Map存储,但生产环境因多实例数据不共享禁用:
// 全局缓存,仅开发测试 const messageCache = new Map(); // 捕获消息时存储,用会话ID做键 const convId = turnContext.activity.conversation.id; messageCache.set(convId, turnContext.activity.text); // 提交卡片时读取 const convId = turnContext.activity.conversation.id; const ques = messageCache.get(convId); // 用完可删除避免内存泄漏 messageCache.delete(convId);
内容的提问来源于stack exchange,提问作者Pmd
相关产品推荐
相关产品推荐

