Absinthe не может сериализовать вложенную карту, но может сериализовать карту верхнего уровня.

Я пытаюсь решить следующее (это возвращаемое значение моей функции распознавателя, и я передаю его макросу resolve):

 {:ok,
 %{
   collection: nil,
   errors: %{
     recoverable: [
       %{
         __exception__: true,
         __recoverable__: true,
         message: %{
           color: %{
             exterior: ["is invalid"], 
             interior: ["is invalid"]
           }
         },
         type: :vehicle_invalid
       }
     ],
     unrecoverable: []
   }
 }}

Это возвращает эту классическую ошибку:

** (Protocol.UndefinedError) protocol String.Chars not implemented for %{color: %{exterior: ["is invalid"], interior: ["is invalid"]}} of type Map. This protocol is implemented for the following type(s): Money, Postgrex.Copy, Postgrex.Query, Floki.Selector.AttributeSelector, Floki.Selector, Floki.Selector.Functional, Floki.Selector.Combinator, Floki.Selector.PseudoClass, Decimal, Float, DateTime, Time, List, Version.Requirement, Atom, Integer, Version, Date, BitString, NaiveDateTime, URI

который я получаю, он не знает, как преобразовать карту в строку, но это приводит к моему фактическому вопросу:

Мне интересно, почему карта верхнего уровня errors может быть проанализирована нормально, но не вложенная карта messages, хотелось бы получить некоторые советы, спасибо!

Примечание. Наш шаблон заключается в том, чтобы ошибки проверки в стиле Ecto возвращались с нашими собственными данными, а не с ошибками запроса Graph верхнего уровня, поэтому кортеж :ok вместо разрешения кортежа :error


person mackshkatz    schedule 11.08.2020    source источник
comment
Применяете ли вы какое-то промежуточное ПО к своим ошибкам? Есть ли в schema.ex функция, которая выглядит так: defp apply(middleware, :errors, _field, _) do?   -  person Peaceful James    schedule 11.08.2020
comment
@PeacefulJames спасибо за ответ, я разместил ответ ниже, как только понял, что происходит :|   -  person mackshkatz    schedule 12.08.2020


Ответы (1)


Ну, на самом деле это было что-то супер очевидное, в моей схеме графа я указываю поле :message как тип :string, и... это, очевидно, карта. Я полагаю, что оставлю этот пост на всякий случай, если кто-то еще делает что-то столь же очевидное, и это поможет им, ха.

Пара вариантов, которые я мог бы использовать для тех, кто следит за ними:

  • Пусть мое поле :message будет какой-то структурой, которая реализует протокол String.Chars, что позволит мне просто передать его вплоть до схемы графа, оставив это поле как тип :string, а затем, когда граф вызовет to_string для этого, он обрабатывает его себя неявно.
  • Я мог бы определить собственный скаляр, указывающий serialize https://hexdocs.pm/absinthe/Absinthe.Schema.Notation.html#serialize/1 для анализа значения :message на выходе, но это, вероятно, повлечет за собой слишком тесную связь схемы графа с базовой структурой.
  • Просто пусть значение :message моей карты будет строкой...
person mackshkatz    schedule 11.08.2020