AWS AppSync простой распознаватель GraphQl в DB Dynamo не работает, и это сводит меня с ума - PullRequest
0 голосов
/ 02 июля 2019

У меня есть очень простой распознаватель graphQL, который я пытаюсь заставить работать, и по какой-то причине это не так, и он продолжает возвращать ноль, хотя я установил GSI для имени пользователя, к которому я пытаюсь выполнить запрос.

Схема GraphQL:

type Query {
    getUsersDevByUsername(username: String!): UsersDev
}

type UsersDev {
    id: ID!
    username: String!
    group: Int
    hasProfile: Boolean
    currentSkill: Int
    highestSkill: Int
}

распознаватель GraphQL по запросу:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "username-index",
    "query" : {
        ## Provide a query expression. **
        "expression": "username = :username",
        "expressionValues" : {
            ":username" : $util.dynamodb.toDynamoDBJson($ctx.args.username)
        }
    }
}

Запрос, который я пытаюсь запустить:

query test {
  getUsersDevByUsername(username:"testUser"){
    id
    username
    group
    currentSkill
    highestSkill

  }
}

Ошибка:

{
  "data": {
    "getUsersDevByUsername": null
  },
  "errors": [
    {
      "path": [
        "getUsersDevByUsername",
        "id"
      ],
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'ID' within parent 'UsersDev' (/getUsersDevByUsername/id)"
    },
    {
      "path": [
        "getUsersDevByUsername",
        "username"
      ],
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'String' within parent 'UsersDev' (/getUsersDevByUsername/username)"
    }
  ]
}

Я понятия не имею, что я делаю неправильно, я включил индекс, который я использую в решателеи я следую примеру, приведенному в примечаниях решателя.Это такой простой запрос, и я не понимаю, зачем нужна вся эта сложность.Время, затрачиваемое на настройку смехотворно простых запросов, для написания которых на SQL потребовалось бы буквально 5 секунд, действительно отвлекает меня от этого.Это должно быть "так здорово", но шаблон, который требуется, чтобы заставить это работать, является смешным.

Может ли кто-нибудь ПОЖАЛУЙСТА помочь мне заставить это работать, чтобы я мог действительно работать над чем-то продуктивным, а не почему простой запрос не работает?

РЕДАКТИРОВАТЬ:

ТАК, наконец-то у меня все заработало.Необходимо изменить результат с:

$util.toJson($ctx.result) 

на:

#if($ctx.result.items.size()>0)
$util.toJson($ctx.result.items[0])
#else
null
#end)

, что не имеет смысла, так как пример AWS для получения его по id использует первый, но как угодно, по крайней мересейчас работает.

1 Ответ

0 голосов
/ 02 июля 2019

Поскольку вы выполняете запрос, ответ будет иметь следующую структуру:

{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10
}

https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-query

В вашем шаблоне отображения ответов вы хотите обработать этот результат:

  • либо просто вернув ctx.result.items
  • или, как в вашем случае, если поля помечены как обязательные и не могут быть нулевыми, вам нужно обработать нулевой регистр
...