AWS AppSyn c GraphQL: DynamoDB ConditionalCheckFailedException при обновлении объекта при мутации - PullRequest
1 голос
/ 16 января 2020

Я моделирую объект User с graphql для собственного приложения реакции с использованием ampify и appsyn c. Мне нужно обновить поле имени после создания пользователя, но я получаю DynamoDB: ConditionalCheckFailedException. Создание пользователей и запрос к таблице User работает нормально, я просто не могу обновить поля существующего объекта.

Я определяю тип User в каталоге моего проекта (ampify / backend / api / schema.graphql) и позволяю CLI-амплификатору генерировать операторы GraphQL (запросы, мутации и подписку) на основе моих типов схем.

Используемая схема:

type User @model @auth(rules: [{allow: owner}]) {
   username: String!
   name: String
}


type Mutation {
    createUser(input: CreateUserInput!, condition: ModelUserConditionInput): User
    updateUser(input: UpdateUserInput!, condition: ModelUserConditionInput): User
    deleteUser(input: DeleteUserInput!, condition: ModelUserConditionInput): User
}

input UpdateUserInput {
    username: String
    name: String
}

Я запускаю мутацию, чтобы создать пользователя с учетными данными вошедшего в систему пользователя. Из консоли AppSyn c я вхожу в систему как пользователь Cognito с тем же именем пользователя (745ab477-5702-4f8d-b938-a987a3d9d192) и запускаю эту мутацию:

mutation updateUser{
    updateUser(input: {
      name: "James"
    }
    condition:{
      username: {eq: "745ab477-5702-4f8d-b938-a987a3d9d192"}
    }){
    username
    name
  }
}

, которая производит:

  {
  "data": {
    "updateUser": null
  },
  "errors": [
    {
      "path": [
        "updateUser"
      ],
      "data": null,
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      "errorInfo": null,
      "locations": [
        {
          "line": 40,
          "column": 5,
          "sourceName": null
        }
      ],
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: HND4VSCK8HLM5NC08VDEV51CORVV4KQNSO5AEMVJF66Q9ASUAAJG)"
    }
  ]
}

Это таблица пользователей DynamoDB после добавления текущего пользователя:

table

1 Ответ

2 голосов
/ 16 января 2020

Вы должны указать первичный ключ в своей схеме

type User @model @auth(rules: [{allow: owner}]) {
   id:ID!,
   username: String!
   name: String
}

и изменить свой запрос, как показано ниже

  mutation updateSampleUser{
      updateSampleUser(
               input:{name:"James",id:"9f4...."}
              )
         {
           name
         }
    }


Это эквивалентно следующему SQL утверждению

 update tbl1 set name = "James" where  id = "9f4...."


и с @auth(rules: [{allow: owner}]) только владелец может сделать обновление.

...