2

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

4

1 回答 1

2

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

对于那些跟随的人,我可以选择几个选项:

  • 让我的:message字段是某种实现String.Chars协议的结构,允许我将它一直传递到图形模式,将该字段作为一种:string类型,然后当图形调用它时to_string,它会隐式处理它。
  • 我可以定义一个自定义标量,它指定一个serialize https://hexdocs.pm/absinthe/Absinthe.Schema.Notation.html#serialize/1函数来解析:message输出的值,但这也可能需要耦合图形模式紧贴底层结构
  • 只需让:message我的地图的值是一个字符串......
于 2020-08-11T21:10:27.920 回答