【问题标题】:Sangria GraphQL Schema with EitherT result带有 EitherT 结果的 Sangria GraphQL Schema
【发布时间】:2018-08-09 11:41:55
【问题描述】:

我正在将 Sangria 用于 Play 应用程序,目前正在努力实现架构定义。问题是,服务没有直接返回所需的对象,它返回一个包含该对象的 EitherT。

这里有一些代码示例

案例类

case class User(name: String, age: Int)

用户服务

def user(): EitherT[Future, AbstractError, User] = {...}

如果服务返回 User 而不是 EitherT[Future, AbstractError, User],我会像这样导出架构:

架构

  val UserType = deriveObjectType[UserService, User]( 
      ObjectTypeName("User"),
      ObjectTypeDescription("A simple user."))

我是否必须实现一个额外的层来从EitherT 对象中提取User,或者是否有其他方法来处理这种情况?

【问题讨论】:

    标签: scala playframework graphql scala-cats sangria


    【解决方案1】:

    您仍然可以派生User 对象类型,因为它只是一个简单的案例类。对于加载用户并返回 EitherT 的其他 GraphQL 字段,您需要将值转换为 sangria 可以使用的值(这意味着这些字段需要手动定义,但您仍然可以将 derive* 宏用于其他字段)。最简单的方法是将其折叠成一个简单的Future[User]Future 能够保存错误或成功结果。如果您在Either 中有一个错误列表,那么您可以将它包装在一些自定义异常中,然后在ExceptionHandler 中解包并正确呈现它。

    【讨论】:

    • 谢谢天师。我会尝试你的解决方案。顺便说一句。桑格利亚汽酒很棒,感谢您的努力!
    【解决方案2】:

    您还可以在架构中的某处使用从猫 EitherT 到桑格利亚汽酒 FutureValue 的隐式转换:

    implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))
    

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 2017-06-10
      • 1970-01-01
      • 2021-12-28
      • 2018-01-11
      • 2017-06-24
      • 2017-06-07
      • 2018-09-07
      • 2018-12-31
      相关资源
      最近更新 更多