AWS AppSync GraphQL запрашивает запись по значению поля - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть таблица пользователей, которая состоит из электронной почты, телефона и т. Д., И я хотел бы запросить запись на основе ее адреса электронной почты или телефона (вместо #Id).Имея неадекватные знания, чтобы сделать это - я написал такую ​​схему:

type Query {
    ...
    getUser(id: ID!): User
    getUserByEmail(input: GetUserByEmailInput!): User
    ...
}
input GetUserByEmailInput {
    email: String!
}

В резольвере против getUserByEmail (..) я попытался поэкспериментировать, но пока ничего не получалось, поэтому он остается в состоянии по умолчанию:

enter image description here

Поэтому, когда я запускаю такой запрос в консоли запросов:

query GetUserByEmail {
    getUserByEmail(input: {email: "email@email.com"}) {
      id
      name
      email
      image
    }
  }

это возвращает ошибку, подобную этой:

{
  "data": {
    "getUserByEmail": null
  },
  "errors": [
    {
      "path": [
        "getUserByEmail"
      ],
      "data": null,
      "errorType": "DynamoDB:AmazonDynamoDBException",
      "errorInfo": null,
      "locations": [
        {
          "line": 41,
          "column": 5,
          "sourceName": null
        }
      ],
      "message": "The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: xxx)"
    }
  ]
}

Как запросить запись по значению поля без идентификатора?

1 Ответ

0 голосов
/ 15 декабря 2018

Если вы используете поток Create Resources в консоли, он создаст запрос listUsers, который выглядит, например, следующим образом.Обратите внимание, что операция DynamoDb будет сканированием с выражением фильтра DynamoDb, где вы можете использовать любое поле для запроса DynamoDb.Ниже приведен шаблон сопоставления.

{
  "version": "2017-02-28",
  "operation": "Scan",
  "filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
  "limit": $util.defaultIfNull($ctx.args.limit, 20),
  "nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
}

Подробнее о сканировании и выражениях фильтра можно найти в документации AWS AppSync:

https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-resolvers.html

...