【问题标题】:Absinthe isn't able to serialize a nested map, yet it is able to serialize a top level mapAbsinthe 无法序列化嵌套地图,但它能够序列化顶级地图
【发布时间】:2020-12-01 11:05:01
【问题描述】:

我正在尝试解决以下问题(这是我的解析器函数的返回值,我将其传递给 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 元组

【问题讨论】:

  • 您是否对错误应用了一些中间件? schema.ex 中是否有如下所示的函数:defp apply(middleware, :errors, _field, _) do
  • @PeacefulJames 感谢您的回复,一旦我意识到发生了什么,我就会在下面发布一个答案:|

标签: elixir ecto phoenix absinthe


【解决方案1】:

嗯,这实际上是非常明显的事情,在我的图形模式中,我将 :message 字段指定为 :string 类型,并且......这显然是一张地图。我想我会留下这篇文章,以防万一其他人正在做同样明显的事情,这可以帮助他们哈哈。

我可以为那些跟随的人选择几个选项:

  • 让我的:message 字段是某种实现String.Chars 协议的结构,允许我将它一直传递到图形模式,将该字段保留为:string 类型,然后当graph 对此调用to_string,它自己隐式处理。
  • 我可以定义一个自定义标量,该标量指定一个 serialize https://hexdocs.pm/absinthe/Absinthe.Schema.Notation.html#serialize/1 函数以在输出时解析 :message 值,但这可能需要将图形模式与底层结构过于紧密地耦合
  • 只需将我的地图的:message 值设为字符串...

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2015-12-30
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2020-02-18
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多