【问题标题】:How to resolve parent to child relationship with AppSync如何使用 AppSync 解决父子关系
【发布时间】:2021-05-15 03:49:33
【问题描述】:

我的架构如下所示

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
}

我希望能够在运行 createPost 突变时同时批量插入 Post 和 PostRevision;但是,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."
    }
  ]
}

我做错了什么?

我知道使用 lambda 函数会更容易解决,但我不想无缘无故地加倍成本。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-appsync vtl


    【解决方案1】:

    您似乎缺少对 $util.dynamodb.toDynamoDBJson 的调用,这导致 AppSync 在 DynamoDB 需要 DynamoDB 特定的输入结构时尝试将纯 JSON 对象放入 DynamoDB,其中每个属性改为成为像“hello world!”这样的普通字符串是一个对象 { "S": "hello world!" }。 $util.dynamodb.toDynamoDBJson 助手会为您处理此问题,以方便使用。您能否尝试将 toDynamoDBJson() 添加到这些行:

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

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      如果有人仍然需要这个问题的答案(这个问题仍然是提到的错误消息的#1 google 点击):

      问题是add()方法的返回值,它返回一个布尔值。

      要解决这个问题,只需将 add() 方法包装到 $util.qr 中,就像您已经为 put() 方法所做的那样:

      $util.qr(($postList.add($post))
      $util.qr(($postRevisionList.add($revision))
      

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 2021-12-12
        • 1970-01-01
        • 2015-05-01
        • 2011-05-26
        • 2020-03-03
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        相关资源
        最近更新 更多