AWS AppSync订阅报MQTT不支持错误 新API下如何实现正常订阅
报错原因
新建的AppSync API默认关闭了基于MQTT over WebSocket的旧订阅通道,当前代码因为Amplify客户端默认走旧MQTT传输链路发起订阅请求,触发服务端的BadRequest异常。整体调整方向是通过配置切换到原生WebSocket over HTTP的实时订阅通道,已编写的GraphQL订阅语句、业务调用逻辑不需要做本质修改。
配置调整步骤
第一步:升级依赖版本
- 将项目内的
aws-amplify依赖升级到v11.0.0及以上版本,低版本客户端没有内置关闭MQTT通道的配置开关,依旧会强制走旧协议发起请求 - 移除项目中独立安装的
@aws-amplify/pubsubMQTT相关依赖包,避免客户端自动加载旧MQTT传输逻辑
升级依赖的命令为:npm install aws-amplify@^11
第二步:修改Amplify初始化配置
在项目全局的Amplify初始化配置文件中,新增订阅传输层的配置,强制禁用MQTT通道,启用原生实时通道,示例配置如下:
// 原有所有Auth、API基础配置完全保留 Amplify.configure({ Auth: { // 原有Auth配置内容不做修改 }, API: { GraphQL: { // 原有endpoint、region、defaultAuthType配置不做修改 subscriptions: { // 显式禁用MQTT客户端能力 mqttClient: { enabled: false }, // 启用原生WebSocket实时订阅处理器 realtimeHandlers: { enabled: true } } } } })
第三步:验证调用逻辑
你在类组件中编写的订阅调用代码完全不需要修改,配置生效后客户端会自动切换为通过HTTP协议发起WebSocket升级握手的方式建立实时连接,不会再向服务端发起MQTT协议的订阅请求:
// 原有业务代码无需改动 API.graphql( graphqlOperation(subscriptions.OnCreateMessage, {conversationId: "c074c7b7-f6db-459a-a1d8-cd290aee33ea"}) ).subscribe({ next: ({ provider, value }) => console.log({provider, value}), error: error => console.warn("did not get messages") });
常见排查点
- 确认对应AppSync API的实时推送能力处于开启状态,没有在控制台手动关闭原生WebSocket订阅功能
- 排查项目内是否存在自定义重写GraphQL连接逻辑的代码,比如手动指定MQTT协议的连接路径,这类代码会绕过全局配置强制走旧协议
- 核对订阅的参数匹配规则:代码中传入的
messageConversationId过滤参数需要和GraphQL schema中定义的订阅入参完全一致,避免因为参数不匹配触发额外的请求异常
内容的提问来源于stack exchange,提问作者Mikey K
相关产品推荐
相关产品推荐

