【问题标题】:AppSync subscription authorization problemAppSync订阅授权问题
【发布时间】:2019-02-08 14:03:40
【问题描述】:

您好,我是 aws AppSync 和 GraphQl 的新手。我有订阅问题。我想在发布新帖子时实时收到通知

这是我的 graphql 架构 ``

type Mutation {
    addPost(
        id: ID!,
        author: String!,
        title: String,
        contennt: String,
        url: String
    ): Post!
    updatePost(
        id: ID!,
        author: String!,
        title: String,
        content: String,
        ups: Int!
    ): Post!
    deletePost(id: ID): Post!
}

type Post {
    id: ID!
    author: String!
    title: String!
    url: String
    content: String
    ups: Int!
}

type Query {
    allPost: [Post]
    getPost(id: ID!): Post
}

type Subscription {
    newPost: Post
        @aws_subscribe(mutations: ["addPost"])
}

schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}
``

这是我的潜艇查询:

subscription NewPostSub{
  newPost{
    __typename
    title
    content
    author
    url
  }
}

我收到错误,提供的关键元素与模式不匹配,在 dynamodb 表中 pk 是 id 并且我生成了映射模板。 谢谢

【问题讨论】:

  • 我需要更多信息来提供帮助。您能否提供 Mutation.addPost 突变的请求和响应映射模板。如果您在 Subscription.newPost 字段上有解析器,请也提供这些解析器。订阅查询不应该关心您的 DynamoDB 架构,所以我怀疑这个错误实际上来自突变。如果您有更多信息,请告诉我。
  • 您好,这里是 addPost 突变的请求:{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { $util.dynamodb.toDynamoDBJson($ ctx.args.id) "id": $util.dynamodb.toDynamoDBJson($util.autoId()), }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) } 这里是响应:$ util.toJson($ctx.result) 这里用于订阅:{ "version": "2017-02-28", "operation": "GetItem", "key": { "id": $util.dynamodb.toDynamoDBJson ($ctx.args.id), } } 这里是响应:$util.toJson($ctx.result) 谢谢@mparis

标签: graphql aws-appsync graphql-subscriptions


【解决方案1】:

感谢您的信息。

首先,您的订阅字段根本不需要解析器。您需要将解析器添加到订阅字段的唯一原因是在连接时根据调用身份进行授权检查。您无需添加解析器即可使订阅正常工作。要修复它,请从订阅 (Subscription.newPost) 字段中删除解析器。

要解决您的用例并使其仅订阅具有特定 ID 的帖子,请将您的 newPost 订阅字段更改为 newPost(id: ID!)。当您进行订阅查询时,提供id 并且该订阅只会收到由订阅到具有该 ID 的突变返回的推送帖子。这是 AppSync 中的一项功能,当您将参数添加到订阅字段时,参数相等检查会自动发生。

其次,当您将其粘贴到评论中时,您目前拥有Mutation.addPost 的此请求映射模板:

{ 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" : { 
    $util.dynamodb.toDynamoDBJson($ctx.args.id) 
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  }, 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
} 

有一个错字,应该是这样的:

{ 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" : { 
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  }, 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
} 

【讨论】:

  • 太棒了!您能否将问题标记为已回答,以供将来的查看者使用。
猜你喜欢
  • 2019-06-18
  • 2021-02-22
  • 2018-07-04
  • 2021-06-03
  • 2020-07-04
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多