Nano Hash - криптовалюты, майнинг, программирование

Как разрешить родительские отношения с дочерними с помощью AppSync

У меня есть схема, как показано ниже

type Post {
    id: ID!
    creator: String!
    createdAt: String!
    like: Int!
    dislike: Int!
    frozen: Boolean!
    revisions:[PostRevision!]
}

type PostRevision {
    id: ID!
    post: Post!
    content: String!
    author: String!
    createdAt: String!
}
type Mutation {
    createPost(postInput: CreatePostInput!): Post
}

Я хотел бы иметь возможность пакетной вставки Post и PostRevision одновременно, когда я запускаю мутацию createPost; однако VTL доставляет мне много хлопот.

Я пробовал ниже

## Variable Declarations
#set($postId = $util.autoId())
#set($postList = [])
#set($postRevisionList = [])
#set($post = {})
#set($revision = {})

## Initialize Post object
$util.qr($post.put("creator", $ctx.args.postInput.author))
$util.qr($post.put("id", $postId))
$util.qr($post.put("createdAt", $util.time.nowEpochMilliSeconds()))
$util.qr($post.put("like", 0))
$util.qr($post.put("dislike", 0))
$util.qr($post.put("frozen", false))

## Initialize PostRevision object
$util.qr($revision.put("id", $util.autoId()))
$util.qr($revision.put("author", $ctx.args.postInput.author))
$util.qr($revision.put("post", $postId))
$util.qr($revision.put("content", $ctx.args.postInput.content))
$util.qr($revision.put("createdAt", $util.time.nowEpochMilliSeconds()))

## Listify objects
$postList.add($post)
$postRevisionList.add($revision)

{
    "version" : "2018-05-29",
    "operation" : "BatchPutItem",
    "tables" : {
        "WHISPR_DEV_PostTable": $util.toJson($postList),
        "WHISPR_DEV_PostRevisionTable": $util.toJson($postRevisionList)
    }
}

Итак, в основном я реконструирую документ в распознавателе createPost, чтобы я мог добавить Post, а затем также добавить ID сообщения в postReivision Однако, когда я запускаю код ниже

mutation insertPost{
  createPost(postInput:{
    creator:"name"
    content:"value"
  }){
    id
  }
}

Я получаю следующую ошибку

{
  "data": {
    "createPost": null
  },
  "errors": [
    {
      "path": [
        "createPost"
      ],
      "data": null,
      "errorType": "MappingTemplate",
      "errorInfo": null,
      "locations": [
        {
          "line": 2,
          "column": 3,
          "sourceName": null
        }
      ],
      "message": "Expected JSON object but got BOOLEAN instead."
    }
  ]
}

Что я делаю не так?

Я знаю, что это было бы проще решить с помощью лямбда-функции, но я не хочу удваивать стоимость без всякой причины. Любая помощь будет принята с благодарностью. Спасибо!


Ответы:


1

Похоже, вы пропустили вызов $util.dynamodb.toDynamoDBJson, из-за которого AppSync пытается поместить простые объекты JSON в DynamoDB, когда DynamoDB требует специальной входной структуры DynamoDB, где каждый атрибут вместо обычная строка типа «привет, мир!» является объектом { "S": "привет, мир!" }. Помощник $util.dynamodb.toDynamoDBJson сделает это за вас для удобства. Не могли бы вы попробовать добавить toDynamoDBJson() в эти строки:

## Listify objects
$postList.add($util.dynamodb.toDynamoDBJson($post))
$postRevisionList.add($util.dynamodb.toDynamoDBJson($revision))

Надеюсь это поможет :)

23.07.2018

2

Если кому-то все еще нужен ответ на это (этот вопрос по-прежнему является хитом Google № 1 для упомянутого сообщения об ошибке):

Проблема заключается в возвращаемом значении метода add(), который возвращает логическое значение.

Чтобы исправить это, просто оберните методы add() в $util.qr, как вы уже делаете для методов put():

$util.qr(($postList.add($post))
$util.qr(($postRevisionList.add($revision))
14.05.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..