TL; DR . Вы должны использовать $util.toJson()
для правильной печати $context.arguments.notes
.Замените ваше $notes
назначение на
#set($notes = $util.toJson($util.defaultIfNullOrEmpty($context.arguments.notes, null)))
Объяснение:
Причина в том, что VTL печатает независимо от того, что возвращает метод toString()
, и ваш вызов $util.defaultIfNullOrEmpty($context.arguments.notes, 'null')
будетвернуть строку "null"
, которая будет напечатана как "null"
.
Если вы замените на $util.defaultIfNullOrEmpty($context.arguments.notes, null)
, он вернет строку null
.Однако VTL напечатает $notes
, потому что так он обрабатывает null
ссылки.Чтобы напечатать null
, который является действительным представлением JSON null
, мы должны сериализовать его в JSON.Итак, правильное утверждение:
#set($notes = $util.toJson($util.defaultIfNullOrEmpty($context.arguments.notes, null)))
Полный тест:
Я предполагаю, что вы начали с образца RDS, представленного в консоли AWS AppSync, и изменили его.Чтобы воспроизвести, я обновил поле content
в схеме, чтобы оно могло быть обнуляемым:
type Mutation {
...
createPost(author: String!, content: String): Post
...
}
type Post {
id: ID!
author: String!
content: String
views: Int
comments: [Comment]
}
, и я изменил схему таблицы posts
, так что content
также может быть нулевым: (внутри функции Lambda)
function conditionallyCreatePostsTable(connection) {
const createTableSQL = `CREATE TABLE IF NOT EXISTS posts (
id VARCHAR(64) NOT NULL,
author VARCHAR(64) NOT NULL,
content VARCHAR(2048),
views INT NOT NULL,
PRIMARY KEY(id))`;
return executeSQL(connection, createTableSQL);
}
Это шаблон запроса для мутации createPost
:
{
"version" : "2017-02-28",
"operation": "Invoke",
#set($id = $util.autoId())
"payload": {
"sql":"INSERT INTO posts VALUES ('$id', :AUTHOR, :CONTENT, 1)",
"variableMapping": {
":AUTHOR" : "$context.arguments.author",
":CONTENT" : $util.toJson($util.defaultIfNullOrEmpty($context.arguments.content, null))
},
"responseSQL": "SELECT id, author, content, views FROM posts WHERE id = '$id'"
}
}
и шаблон ответа:
$util.toJson($context.result[0])
Следующий запрос:
mutation CreatePost {
createPost(author: "Me") {
id
author
content
views
}
}
возвращает:
{
"data": {
"createPost": {
"id": "b42ee08c-956d-4b89-afda-60fe231e86d7",
"author": "Me",
"content": null,
"views": 1
}
}
}
и
mutation CreatePost {
createPost(author: "Me", content: "content") {
id
author
content
views
}
}
возвращает
{
"data": {
"createPost": {
"id": "c6af0cbf-cf05-4110-8bc2-833bf9fca9f5",
"author": "Me",
"content": "content",
"views": 1
}
}
}