Добавление дополнительного поля в обработчике приложений aws - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть отношение «многие ко многим» между пользователями и группами в моей схеме, с дополнительным полем enum для уровня отношений.Я могу добавить дополнительное поле отношения в мой набор данных, но получаю ошибку проверки схемы:

"Предоставленный ключевой элемент не соответствует схеме (Сервис: AmazonDynamoDBv2; Код состояния: 400; ОшибкаКод: ValidationException; Идентификатор запроса: 2615V0KG8272IHVENE3DBSBCTVVV4KQNSO5AEMVJF66Q9ASUAAJG) "

Схема:

type Group {
    id: ID!
    created: AWSDateTime!
    createdById: ID!
    createdBy: User!
    title: String!
    description: String
    users(first: Int, after: String): GroupUsersConnection
}

enum GroupRoles {
    admin
    user
}

type GroupUsers {
    id: ID!
    created: AWSDateTime!
    role: GroupRoles!
    userId: ID!
    groupId: ID!
}

type GroupConnection {
    items: [Group]
    nextToken: String
}

type GroupUsersConnection {
    items: [UserWithRole]
    nextToken: String
}

type Mutation {
    createGroup(input: CreateGroupInput!): Group
    createUser(input: CreateUserInput!): User
    createGroupUsers(input: CreateGroupUsersInput!): GroupUsers
}

type Query {
    getGroup(id: ID!): Group
    listGroups(filter: TableGroupFilterInput, limit: Int, nextToken: String): GroupConnection   
    getUser(id: ID!): User
    listUsers(filter: TableUserFilterInput, limit: Int, nextToken: String): UserConnection
}

input TableGroupFilterInput {
    id: TableIDFilterInput
    created: TableStringFilterInput
    createdById: TableIDFilterInput
    title: TableStringFilterInput
    description: TableStringFilterInput
}

input TableUserFilterInput {
    id: TableIDFilterInput
    created: TableStringFilterInput
    email: TableStringFilterInput
    password: TableStringFilterInput
    name: TableStringFilterInput
    avatar: TableStringFilterInput
    isOnline: TableBooleanFilterInput
}

type User {
    id: ID!
    created: AWSDateTime!
    email: AWSEmail!
    password: String!
    name: String
    avatar: String
    isOnline: Boolean!
    groups(first: Int, after: String): UserGroupsConnection
}

type UserConnection {
    items: [User]
    nextToken: String
}

type UserGroupsConnection {
    items: [Group]
    nextToken: String
}

type UserWithRole {
    id: ID!
    created: AWSDateTime!
    email: AWSEmail!
    password: String!
    name: String
    avatar: String
    isOnline: Boolean!
    role: GroupRoles!
}

schema {
    query: Query
    mutation: Mutation
}

как источник данных для 1014 GroupUsersConnection.items 1013 * с разрешением UserTable 1013 *1013* с разрешением *1014* 1013 *1013* 1013 * с разрешением *1014* 1013 *1013* с разрешением *1014* 1013 *1013* с разрешением *1014* 1013 *1013* 1013 * с разрешением для *1014* 1013 *1013* с разрешением *1014* 1013 *1013* 1013:

##--------------------------
## request mapping template
##--------------------------
#if( ${ctx.source.items.isEmpty()} )
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "consistentRead": true
}
#else
  #set($userIds = [])
  #foreach($groupUser in ${ctx.source.items})    
      #set($userIdMap = {})
      $util.qr($userIdMap.put("id", $util.dynamodb.toString($groupUser.get("userId"))))
      $util.qr($userIds.add($userIdMap))
  #end

  {
      "version" : "2018-05-29",
      "operation" : "BatchGetItem",
      "tables" : {
          "UserTable": {
              "keys": $util.toJson($userIds),
              "consistentRead": true
          }
      }
  }
#end

##--------------------------
## response mapping template
##--------------------------
#if ( ! ${ctx.result.data} )
    $util.toJson([])
#else
    #foreach($user in ${ctx.result.data.UserTable})
        #set($idx = $foreach.count-1)
        #set($role = $ctx.source.items.get(0).get("role"))
        $util.qr($user.put("role", $role))
        $util.qr($usersWithRoles.add($user))        
    #end
    $util.toJson($ctx.result.data.UserTable)
#end

Это запрос, который я пытаюсь выполнить, с полным результатом:

query ListGroups {
  listGroups {
    items {
      id
      title
      createdById
      createdBy {
        name
        email
      }
      users {
        items {
          id
          name
          role
        }
      }
    }
  }
}

{
  "data": {
    "listGroups": {
      "items": [
        {
          "id": "72423554-fe02-4644-92e4-4bd2a2702d85",
          "title": "My first group",
          "createdById": "e626fab4-b099-4736-91f0-dcbf5fc2e47e",
          "createdBy": {
            "name": "John Doe",
            "email": "john@doe.com"
          },
          "users": {
            "items": [
              null
            ]
          }
        }
      ]
    }
  },
  "errors": [
    {
      "path": [
        "listGroups",
        "items",
        0,
        "users",
        "items",
        0,
        "role"
      ],
      "data": null,
      "errorType": "DynamoDB:AmazonDynamoDBException",
      "errorInfo": null,
      "locations": [
        {
          "line": 105,
          "column": 11,
          "sourceName": null
        }
      ],
      "message": "The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: NB3G15C13BUMEQ3OK6VPNVA3LFVV4KQNSO5AEMVJF66Q9ASUAAJG)"
    }
  ]
}

1 Ответ

0 голосов
/ 20 февраля 2019

Похоже, что это ошибка 400, что может означать, что структура шаблона сопоставления ваших запросов не соответствует структуре ключа Amazon DynamoDB.

Пожалуйста, включите журналы CloudWatch (с параметром «ВСЕ») на странице настроеквашего API.Как только вы это сделаете, запустите тот же запрос еще раз.Это позволит зарегистрировать оцененный шаблон RequestMapping в журналах.Затем вы можете проанализировать запрос к DynamoDB и сравнить его со схемой таблицы.В одном из вызовов должно быть несоответствие.

Логическое поле «fieldInError» в журнале шаблона отображения указывает, успешно ли выполнено разрешение определенного пути, поэтому вы можете просто проанализировать неудачные.

...