迁移到纯 websocket 后,我​​在 AWS Appsync 上收到 GraphQL 订阅错误

Posted

技术标签:

【中文标题】迁移到纯 websocket 后,我​​在 AWS Appsync 上收到 GraphQL 订阅错误【英文标题】:After migrating to pure websocket, I get a GraphQL subscription error on AWS Appsync 【发布时间】:2021-11-14 11:33:42 【问题描述】:

由于最近的一些 AWS 限制,在 Appsync 上使用 GraphQL 订阅时,我不能再使用 MQTT over Websockets。 基于this link from AWS,我更改了我的Python代码库。

好像连接正确,但是订阅的时候出现如下错误:

'message': "Cannot return null for non-nullable type: 'ID' within parent 'Command' (/onCommandCreated/commandId)"

Command 对象的每个字段都会重复出现此错误。

这是架构:

type Command 
    commandId: ID!
    createdAt: AWSDateTime!
    command: String!
    arguments: [String]!
    deviceId: ID!
    status: Int!


type Mutation 
    submitCommand(command: NewCommand!): Command


input NewCommand 
    command: String!
    arguments: [String]!
    deviceId: ID!


type Subscription 
    onCommandCreated(deviceId: ID!): Command
        @aws_subscribe(mutations: ["submitCommand"])


schema 
    mutation: Mutation
    subscription: Subscription

这是我的订阅:


    "query": """subscription onCommand($deviceId: ID!) 
                    onCommandCreated(deviceId: $deviceId) 
                        commandId
                        deviceId
                        command
                        arguments
                        status
                      
                    
                """,
    "variables": "deviceId": <a device id>

我完全不清楚的是,我在切换到纯 websockets 后开始遇到这个问题。

我已经比较了纯 websockets 和 MQTT 之间的 Cloudwatch 日志,但我没有发现任何相关差异,除了请求 ID 和计时日志。

哦,忘了说我用的是OIDC认证方式。

代码库可用here。 谢谢,

【问题讨论】:

【参考方案1】:

最后我删除了Command 对象的非空要求。

因此,新的Command 对象如下:

type Command 
    commandId: ID
    createdAt: AWSDateTime
    command: String
    arguments: [String]
    deviceId: ID
    status: Int

这不是一种解决方案,而是一种解决方法。

欢迎任何更体面的解决方案。

【讨论】:

以上是关于迁移到纯 websocket 后,我​​在 AWS Appsync 上收到 GraphQL 订阅错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS 应用程序负载均衡器上的 Websocket + SSL

DNS 迁移后出现 503 错误 AWS ELB

从 mongoDB 迁移后的 AWS DocumentDB 错误

迁移到 aws 后如何使用推送通知

AWS Beanstalk - 在 Rails 4.2.1 迁移后,Passenger Standalone 不提供网页服务

无法使用 Forge、nginx 和 AWS 连接到 Laravel Websocket