Amazon Connect ChatJS中Agent发消息时onMessage事件未触发问题
问题:Amazon Connect ChatJS的onMessage/onTyping事件未触发,WebSocketManager返回undefined
我正在集成Amazon Connect聊天机器人,需要建立客户与坐席的连接。原本用aws-sdk和@aws-sdk/client-connectparticipant,通过startChatContact -> createParticipantConnection -> sendEvent -> sendMessage流程实现了客户发消息给坐席,但获取坐席消息只能靠每2秒轮询getTranscript并去重,现在想换更优的ChatJS方案,但遇到以下问题:
- 创建Agent/Customer ChatSession后,
onMessage事件完全没触发 onTyping事件也未触发- 新增日志后发现代码没走到
contact.onAccepted回调,且connect.core.getWebSocketManager()返回undefined
现有代码
Agent端会话创建代码
import "amazon-connect-streams"; import "amazon-connect-chatjs"; connect.contact(contact => { if (contact.getType() !== connect.ContactType.CHAT) { return; } contact.onAccepted(() => { // 此处添加console.log未输出,说明回调未执行 const cnn = contact.getConnections().find(cnn => cnn.getType() === connect.ConnectionType.AGENT); const agentChatSession = connect.ChatSession.create({ chatDetails: cnn.getMediaInfo(), options: { region: "us-west-2" }, type: connect.ChatSession.SessionTypes.AGENT, websocketManager: connect.core.getWebSocketManager() }); }); });
尝试过的Customer端会话创建代码
const customerChatSession = connect.ChatSession.create({ chatDetails: { contactId: "...", participantId: "...", participantToken: "..." }, options: { region: "us-west-2" }, type: connect.ChatSession.SessionTypes.CUSTOMER });
排查与解决方案
1. 先确认Streams和ChatJS的加载顺序与初始化流程
- 必须确保Streams先完成初始化:ChatJS依赖Streams的核心上下文,不能仅靠import顺序,要等
connect.core.init()完成后再执行ChatSession相关代码。示例:connect.core.init({ ccpUrl: 'https://<你的实例地址>.awsapps.com/connect/ccp-v2/', loginPopup: true, region: 'us-west-2' }); // 等CCP初始化完成后再监听contact事件 connect.core.onConnect(function() { connect.contact(contact => { // 后续逻辑 }); }); - 当前代码没触发
contact.onAccepted,大概率是Streams还没完成初始化就绑定了contact监听,导致错过了事件。
2. WebSocketManager返回undefined的解决
connect.core.getWebSocketManager()只有在Streams初始化完成(CCP加载完成)后才会返回实例,必须放在connect.core.onConnect回调内执行。- 如果是自定义集成(不嵌入官方CCP),需要手动初始化WebSocketManager:
const websocketManager = new connect.WebSocketManager({ region: 'us-west-2', instanceId: '<你的Connect实例ID>' }); // 替换原来的connect.core.getWebSocketManager()
3. 必须为ChatSession绑定事件监听并启动会话
你当前代码只创建了ChatSession,但遗漏了事件绑定和会话启动步骤,这是核心问题:
// Agent端示例 contact.onAccepted(() => { const cnn = contact.getConnections().find(cnn => cnn.getType() === connect.ConnectionType.AGENT); const websocketManager = connect.core.getWebSocketManager(); const agentChatSession = connect.ChatSession.create({ chatDetails: cnn.getMediaInfo(), options: { region: "us-west-2" }, type: connect.ChatSession.SessionTypes.AGENT, websocketManager: websocketManager }); // 绑定onMessage事件 agentChatSession.onMessage((message) => { console.log('收到消息:', message); }); // 绑定onTyping事件 agentChatSession.onTyping((typingEvent) => { console.log('对方正在输入:', typingEvent.participantId); }); // 必须启动会话 agentChatSession.connect(); });
4. Customer端会话的注意事项
- Customer端的
chatDetails必须包含有效的participantToken,这个token是从createParticipantConnection接口返回的,不能使用过期或无效的token。 - 创建后同样需要绑定事件并调用
connect():const customerChatSession = connect.ChatSession.create({ chatDetails: { contactId: "<有效contactId>", participantId: "<有效participantId>", participantToken: "<有效participantToken>" }, options: { region: "us-west-2" }, type: connect.ChatSession.SessionTypes.CUSTOMER }); customerChatSession.onMessage((msg) => console.log('收到消息:', msg)); customerChatSession.connect();
5. 权限与配置检查
- 确认你的IAM角色拥有
connect:GetContactAttributes、connect:SendChatMessage等必要权限。 - 检查Amazon Connect实例的聊天配置是否开启了WebSocket支持(默认开启,需确认无手动关闭)。
内容的提问来源于stack exchange,提问作者Aditya Shrivastava
相关产品推荐
相关产品推荐

