首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有GraphQL结果的Sangria EitherT模式

带有GraphQL结果的Sangria EitherT模式
EN

Stack Overflow用户
提问于 2018-03-01 11:49:36
回答 2查看 296关注 0票数 0

我正在使用Sangria作为Play应用程序,目前正在努力实现模式定义。问题是,服务不直接返回所需的对象,而是返回包含该对象的EitherT。

下面是一些代码示例

案例类

代码语言:javascript
复制
case class User(name: String, age: Int)

UserService

代码语言:javascript
复制
def user(): EitherT[Future, AbstractError, User] = {...}

如果服务将返回一个User而不是一个EitherT[Future, AbstractError, User],我将派生如下模式:

模式

代码语言:javascript
复制
  val UserType = deriveObjectType[UserService, User]( 
      ObjectTypeName("User"),
      ObjectTypeDescription("A simple user."))

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 13:14:25

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

票数 1
EN

Stack Overflow用户

发布于 2018-12-12 16:00:15

您还可以在模式中的某个地方使用从cats EitherT到sangria FutureValue的隐式转换:

代码语言:javascript
复制
implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49049119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档