Как вставить необязательное поле как пустое с помощью резольверов AppSync и Aurora? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть необязательное поле String, notes , которое иногда пусто.Если он пуст, я хочу вставить null , в противном случае я хочу вставить строку.

Вот мой распознаватель -

{
    "version" : "2017-02-28",
    "operation": "Invoke",
        #set($id = $util.autoId())
        #set($notes = $util.defaultIfNullOrEmpty($context.arguments.notes, 'null'))

        "payload": {
          "sql":"INSERT INTO things VALUES ('$id', :NOTES)",
          "variableMapping": {
            ":NOTES" : $notes
          },
          "responseSQL": "SELECT * FROM things WHERE id = '$id'"
        }

}

С этим graphql

mutation CreateThing{
  createThing() {
    id
    notes
  }
}

я получаю -

{
  "data": {
    "createRoll": {
      "id": "6af68989-0bdc-44e2-8558-aeb4c8418e93",
     "notes": "null"
   }
 }

}

, когда я действительно хочу null без кавычек.

И с этим graphql -

mutation CreateThing{
  createThing(notes: "Here are some notes") {
    id
    notes
  }
}

Я получаю -

{
  "data": {
    "createThing": {
      "id": "6af68989-0bdc-44e2-8558-aeb4c8418e93",
      "notes": "Here are some notes"
    }
  }
}

, что я и хочу.

Как получить нулевое значение без кавычек и цитатустрока в том же поле?

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Мы рассматривали ту же проблему.Почему-то принятый ответ у нас не работает.Возможно, потому что это бета-функция, и есть новая версия решателя (2018-05-29 против 2017-02-28, изменения здесь: Журнал изменений шаблона сопоставления резольвера ).

Мы используем этов настоящее время используется NULLIF():

{
    "version": "2018-05-29",
    "statements": [
        "INSERT INTO sales_customers_addresses (`id`, `customerid`, `type`, `company`, `country`, `email`) VALUES (NULL, :CUSTOMERID, :TYPE, NULLIF(:COMPANY, ''), NULLIF(:COUNTRY, ''), :EMAIL)"
    ],
    "variableMap": {
        ":CUSTOMERID": $customerid,
        ":TYPE": "$type",
        ":COMPANY": "$util.defaultIfNullOrEmpty($context.args.address.company, '')",
        ":COUNTRY": "$util.defaultIfNullOrEmpty($context.args.address.country, '')",
        ":EMAIL": "$context.args.address.email"
    }
}
0 голосов
/ 21 ноября 2018

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
    }
  }
}
...