由于最近的一些AWS限制,当在Appsync上使用GraphQL订阅时,我不能再通过Websockets使用MQTT。基于这个来自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认证方法。
代码库可在这里获得。谢谢你,
最后,我删除了Command
对象的非空要求。
Command
对象如下:
type Command {
commandId: ID
createdAt: AWSDateTime
command: String
arguments: [String]
deviceId: ID
status: Int
}
这不是一个解决方案,而是一个变通方法。
欢迎任何更好的解决方案。