Решения AWS Appsync для обновленных связанных таблиц

The Guru спросил: 12 мая 2018 в 04:49 в: amazon-web-services

Я пытаюсь написать resolver для связанных объектов.

Вот как выглядит моя схема.

type User{
id:ID!
name: String!
posts:[Post] #Resolver 1
}type Post{
id:ID!,
title: String!
body: String!
}type CreatePostInput{
id:ID!,
title: String!
body: String!
}
type mutation{
addUserPost(userid:ID!, input:CreatePostInput!): Post
}

Теперь я добавил распознаватель для сообщений ( см. #resolver 1) как

{
"version" : "2017-02-28",
"operation" : "Scan",
 "key": {
    "userid" : { "S" : "${context.source.id}" }
},
}

Теперь я добавил распознаватель для мутации addUserPost как

{
  "version" : "2017-02-28",
  "operation" : "PutItem",
   "key": {
      "userid" : { "S" : "${context.arguments.userid}" },
     "input" : $util.dynamodb.toDynamoDBJson(${context.arguments.input})     
     }    
}

Теперь, когда я запускаю запрос

mutation addnewposttest{
  addChapterToCourse(addUserPost:"c85a0508-ee0e-4ad8-8629-34880e1c6d74",
    input:{
      title:"Demo",
      body:"Test Body",
      id: "c85a0508-c85a0-508c-85a-0508"
    }){
      id
    }
}

Я получаю DynamoDB: AmazonDynamoDBException, поскольку одно или несколько значений параметра были недопустимыми: Отсутствие идентификатора ключа в элементе (Сервис: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: ValidationException; Идентификатор запроса: XXXXXXXXXXXX

Я попытался изменить источник данных для второго распознавателя, но не повезло. Я не нашел никакой хорошей формы документации AWS, кроме этого, но это говорит о простом строковом типе данных, а не о том, для коллекции типов объектов.

Может кто-нибудь помочь мне понять, как бороться с отношениями в resolvers? Спасибо

2 ответа

Lisa M Shon ответил: 13 мая 2018 в 08:18

Как я уже сказал, у вас есть обновление.

Но основная проблема заключается в том, что ваш шаблон resolver для addUserPost содержит userid, но похоже, что вам нужно изменить его на id. Похоже, что ваш тип пользователя или тип сообщения не имеют поля с именем userid

The Guru ответил: 13 мая 2018 в 02:54
Спасибо за ваш ответ. См. Эту статью, docs.aws.amazon.com/appsync/latest/devguide/..., я просто последовал этому. userid соответствует параметрам (ключам) для мутации. Теперь я усердно изучил, что это работает только в том случае, если оба этих объекта живут в одной таблице и имеют одинаковый источник данных.
The Guru ответил: 19 мая 2018 в 04:20

Я имел в виду две отдельные таблицы данных и для хранения данных в двух таблицах мне нужно использовать элемент BatchUpdate и указать имена таблиц. Тем не менее, я не мог сделать это, как в моем случае, мне пришлось вставлять одну таблицу и обновлять ее в другой таблице. Наконец, я закончил копирование идентификатора в другой коллекции и построил на нем индекс.

Вот как выглядела моя последняя схема

type User{
id:ID!
name: String!
posts:[Post] #Resolver 1 -
}type Post{
id:ID!,
userId:ID!# I will look for source.id on this field
title: String!
body: String!
}

Спасибо всем за качку!