如何使用 AppSync 解决父子关系
How to resolve parent to child relationship with 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 突变时同时批量插入 Post 和 Post 修订版;然而,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
然后还可以将 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 函数会更容易解决问题,但我不想无缘无故地将成本增加一倍。任何帮助将不胜感激。谢谢!
您似乎缺少对 $util.dynamodb.toDynamoDBJson 的调用,这导致 AppSync 在 DynamoDB 需要时尝试将纯 JSON 对象放入 DynamoDB一个 DynamoDB 特定的输入结构,其中每个属性而不是像 "hello world!" 这样的纯字符串是一个对象 { "S": "hello world!" }。为了方便起见,$util.dynamodb.toDynamoDBJson 助手会为您处理此问题。您能否尝试将 toDynamoDBJson() 添加到这些行中:
## Listify objects
$postList.add($util.dynamodb.toDynamoDBJson($post))
$postRevisionList.add($util.dynamodb.toDynamoDBJson($revision))
希望这对您有所帮助:)
如果有人仍然需要这个问题的答案(这个问题仍然是提到的错误消息的#1 google命中):
问题是 add() 方法的 return 值,它 return 是一个布尔值。
要解决此问题,只需将 add() 方法包装到 $util.qr
中,就像您已经对 put() 方法所做的那样:
$util.qr(($postList.add($post))
$util.qr(($postRevisionList.add($revision))
我的架构如下所示
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 突变时同时批量插入 Post 和 Post 修订版;然而,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
然后还可以将 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 函数会更容易解决问题,但我不想无缘无故地将成本增加一倍。任何帮助将不胜感激。谢谢!
您似乎缺少对 $util.dynamodb.toDynamoDBJson 的调用,这导致 AppSync 在 DynamoDB 需要时尝试将纯 JSON 对象放入 DynamoDB一个 DynamoDB 特定的输入结构,其中每个属性而不是像 "hello world!" 这样的纯字符串是一个对象 { "S": "hello world!" }。为了方便起见,$util.dynamodb.toDynamoDBJson 助手会为您处理此问题。您能否尝试将 toDynamoDBJson() 添加到这些行中:
## Listify objects
$postList.add($util.dynamodb.toDynamoDBJson($post))
$postRevisionList.add($util.dynamodb.toDynamoDBJson($revision))
希望这对您有所帮助:)
如果有人仍然需要这个问题的答案(这个问题仍然是提到的错误消息的#1 google命中):
问题是 add() 方法的 return 值,它 return 是一个布尔值。
要解决此问题,只需将 add() 方法包装到 $util.qr
中,就像您已经对 put() 方法所做的那样:
$util.qr(($postList.add($post))
$util.qr(($postRevisionList.add($revision))