使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

Posted

技术标签:

【中文标题】使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥【英文标题】:What is the correct way to call multiple GraphQL mutations with Prisma and Apollo使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是什么 【发布时间】:2020-03-20 05:11:56 【问题描述】:

我有以下数据库模型

type GlobalUser 
  email: String 
  createdAt: DateTime! 
  updatedAt: DateTime! 


type Client 
  global_user: GlobalUser! 
  createdAt: DateTime! 
  updatedAt: DateTime! 

每次创建 GlobalUser 时,我都想在 client 表中创建一个 Client。 如果我选择使用 Apollo 从应用程序的 Angular 客户端执行此操作,这可能是我使用 Promises 调用一个又一个突变的方法。

document = gql`
  mutation createGlobalUser(
    $email: String!, $password: String!
  ) 
    createGlobalUser(
      email: $email, password: $password,
    ) 
      email
    
  
`;

createGlobalUserService.mutate(

      email: email

).toPromise().then((res) => 

    createClientService.mutate(

        global_user: res.data.id

 ).catch(err => 
     console.log(err);
 );

我没有从服务器端的 Prisma 解析器中找到方法

const Mutation = 
 async createGlobalUser(root, args, context) 
   const user = await context.prisma.createGlobalUser(
       ...args
   );
   return 
     id
     email
   
 

有没有一种方法可以在 Angular 中使用 Apollo 从客户端组合和执行多个 Mutation?还是在服务器端做更好?

【问题讨论】:

【参考方案1】:

如果您将客户端添加为与数据模型的关系,如下所示:


type GlobalUser 
  email: String 
  createdAt: DateTime! 
  updatedAt: DateTime! 
  client: Client! @relation(name: "UserClient")


type Client 
  global_user: GlobalUser! @relation(name: "UserClient")
  createdAt: DateTime! 
  updatedAt: DateTime! 

您可以在来自前端的一个请求中使用 prisma 客户端创建客户端。例如:

document = gql`
  mutation createGlobalUser(
    $email: String!, $password: String!
  ) 
    createGlobalUser(
      data: 
        email: $email
        password: $password
        client: 
           create:  ... 
        
    ) 
      email
    
  
`;

更多信息请查看:https://www.prisma.io/docs/datamodel-and-migrations/datamodel-POSTGRES-knum/#the-@relation-directive

【讨论】:

以上是关于使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo + GraphQL 将 Prisma 1 升级到 Prisma 2

Apollo / GraphQL / Prisma“登录”突变不会返回所有用户字段

Apollo 和 Prisma Graphql 显式模型关系不可查询

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型

React-Apollo-Prisma-Graphql

Prisma Playground 中的 React + Apollo“入门”错误