使用Microsoft Bot Node SDK在Microsoft Teams中提及用户的问题
解决Teams Node.js SDK提及用户无效的问题
看起来你踩了两个常见的坑——找错了要提及的用户对象,同时消息文本和提及实体的匹配没做好。咱们一步步来修正:
核心问题1:用错了要提及的用户对象
当你通过保存的对话引用恢复会话时,context.activity.from对应的是机器人自身,而不是你要@的目标用户!你需要从保存的conversation对象里获取用户信息——也就是原对话中的recipient字段(因为你存的对话引用里,recipient就是和机器人对话的用户)。
核心问题2:消息文本必须包含匹配的<at>标签
Teams要求消息文本里明确写出<at>用户名</at>,并且这段文本要和Mention实体的text字段完全一致,这样才能触发高亮和提醒效果。
修正后的完整代码
const message = "Konnichi wa"; const conversation = await .... // 从数据库恢复,确保conversation包含recipient字段 await adapter.continueConversation(conversation, async (context) => { // 从保存的对话引用中获取要提及的目标用户 const targetUser = conversation.recipient; // 构造正确的Mention实体 const mention = { type: "mention", // 注意这里是小写的"mention" mentioned: targetUser, // 传入包含id和name的正确用户对象 text: `<at>${targetUser.name}</at>`, // 这段文本要和消息中的标签完全一致 }; // 消息文本必须包含对应的<at>标签 const fullMessageText = `${mention.text} ${message}`; const topLevelMessage = MessageFactory.text(fullMessageText); topLevelMessage.entities = [mention]; await context.sendActivity(topLevelMessage); });
为什么之前的尝试无效?
- 第一次尝试:你用
context.activity.from作为提及对象,本质是@了机器人自己,自然不会显示用户提及效果;同时消息文本里没有包含<at>标签,Teams无法识别要高亮的内容。 - 第二次尝试:错误地对用户名进行编码,导致
<at>标签里的内容和实际用户名不匹配,而且同样没用到正确的用户对象。
额外注意事项
- 确保保存到数据库的对话引用
conversation里的recipient字段完整,必须包含用户的id和name属性,缺少任何一个都会导致提及失效。 - 如果用户名称包含特殊字符,不需要手动转义,SDK会自动处理成Teams能识别的格式。
内容的提问来源于stack exchange,提问作者Manu Artero




