Prisma GraphQL-Yoga:解析器需要异步吗?

Posted

技术标签:

【中文标题】Prisma GraphQL-Yoga:解析器需要异步吗?【英文标题】:Prisma GraphQL-Yoga: do the resolvers need to be asynchronous? 【发布时间】:2019-08-03 06:47:52 【问题描述】:

我正在尝试使用 GraphQL-Yoga 来了解 Prisma 和 GraphQL。一件事让我对解析器感到困惑。在 Prisma 示例 (https://github.com/prisma/prisma-examples/blob/master/node/graphql/src/index.js) 中,DB 调用似乎是同步的,例如

 Mutation: 
    signupUser: (parent,  email, name , context) => 
      return context.prisma.createUser(
        email,
        name,
      )
    ,

但我见过其他示例,其中必须await 从 Prisma 返回。不应该所有这些数据库访问调用都是异步的,比如

 Mutation: 
        signupUser: async (parent,  email, name , context) => 
          return await context.prisma.createUser(
            email,
            name,
          )
        ,

【问题讨论】:

【参考方案1】:

首先,解析器(可以)返回一个承诺。他们不必这样做,但在您的两个代码示例中,解析器都会返回一个承诺。熟悉 Promise,现在几乎所有异步的事情都是用 Promise 完成的!

接下来您应该阅读 javascript 中的异步函数。 async/await 是 promise 的语法糖。因此他们总是返回一个承诺(即使你没有在里面使用await)。

第一个示例显式返回一个 Promise。第二个示例相同但隐含(这里也不需要等待,但这将使其再次显式)。当您在之后实际修改值时,这两个示例都会变得更有趣:

signupUser: (parent,  email, name , context) => 
  return context.prisma.createUser(
    email,
    name,
  ).then(user => 
    return  ...user, isCool: user.friends > 5 ;
  );

// vs. async function
signupUser: async (parent,  email, name , context) => 
  const user = await context.prisma.createUser(
    email,
    name,
  ;
  return  ...user, isCool: user.friends > 5 ;

语法糖意味着它背后没有实际的新语言功能。通常,编译器在编译之前首先对语法进行脱糖(尤其是在函数式语言中)。作为一种心智模型,您可以想象将异步函数重写为承诺形式。这将使他们更容易理解为什么他们总是返回承诺以及他们实际在做什么。 在掌握了这个概念之后,您将了解这两个示例实际上都是异步的,并且您示例中的 await 是可选的(但只是因为它跟随返回。如果您查看第二个示例,您可能还会明白为什么人们声称“ async 看起来更同步”:它摆脱了回调。

【讨论】:

使用静态类型对我也有很大帮助:它迫使我处理值的类型。 Prisma 客户端还附带了 Flow 和 TypeScript 的类型!

以上是关于Prisma GraphQL-Yoga:解析器需要异步吗?的主要内容,如果未能解决你的问题,请参考以下文章

正确声明 GraphQL Yoga 提供的 Prisma 字段但在解析器中不需要的方法

Type as property 使用 graphql-yoga 和 prisma 解析为 null

将 Stripe webhook 与 graphql-yoga 和 Prisma 一起使用

markdown 来自graphql-yoga(后端)的prisma服务器连接测试

graphql-yoga - GraphQL 解析器参数在哪里定义和记录?

在 graphql-yoga 中返回枚举的解析器函数是啥样的?