【问题标题】:How does GraphQL Mutation associate itself with TypeGraphQL Mutation 如何与 Type 关联
【发布时间】:2019-09-23 10:55:13
【问题描述】:

当我如下设置我的架构时:

type Mutation {
    createUser(data: CreateUserInput!): User!
}

type User {
    id: ID!
    name: String!
    password: String!
    email: String!
    posts: [Post!]!
    comments: [Comment!]!
}

和我的解析器:

const Mutation = {
    async createUser(parent, args, { prisma }, info) {
        if(args.data.password.length < 8) {
            throw new Error("Pasword must be 8 characters or longer")
        }
        return prisma.mutation.createUser({ 
            data: {
                ...args.data,
                password
            } 
        })
    }
}

GraphQL 如何知道createUser 与我的User 模型相关联?我可以设置它以便createUser 返回令牌而不是用户(在生成令牌之后),或者我可以将createUser 重命名为createPerson。我从未定义过createUserUser 之间的关联。我不确定我通过createUser 输入的数据如何被定向保存在user 表中,而不是另一个表中。

【问题讨论】:

  • 您是否询问架构中的User 类型和prisma.mutation.createUser
  • 是的,没错

标签: javascript reactjs graphql prisma


【解决方案1】:

两者之间没有关联。

你的解析器可以很容易地返回一个带有一些虚拟数据的普通对象:

async createUser(parent, args, { prisma }, info) {
  ...
  return { 
    id: 1,
    name: 'Kevvv',
    password: 'password',
    email: 'kevvv@stackoverflow.com',
  }
}

或使用其他方式获取用户:

async createUser(parent, args, { prisma }, info) {
  ...
  return fetchUserFromAPI()
  // or some other data source like a DB
}

prisma.mutation.createUser 返回一个 Promise,它解析为代表创建用户的对象。此对象恰好具有与您在架构中指定的 User 类型匹配的属性,但除此之外没有什么“特别”的地方。

【讨论】:

  • 那么突变如何在我的 Postgres 或 MongoDB 中创建一个专门命名为 User 的表?
  • 执行 createUser 时,Playground 界面还会自动显示所有用户属性,如姓名、电子邮件等
  • 您的突变在您的数据库中创建了一行,因为您在其解析器中调用了prisma.mutation.createUser。 Prisma 客户端是根据您为 Prisma 服务器提供的数据模型定义自动生成的。您定义一个User 数据模型,当客户端生成时,它会自动创建适当的 Prisma 客户端方法。
  • Playground 显示来自您的架构的 User 类型,而不是来自 Prisma。两者仅在您的架构将它们关联时才相关。例如,您可以将架构类型称为User,但将数据模型称为Person。然后您的表将被称为 Person 并且客户端调用将是 prisma.mutations.createPerson,但其他任何内容都不会改变。
  • 我想我还是很困惑。在 MongoDB 中,我在我的解析器中专门实例化了类似 new User({ user: req.userId }) 的东西,以便突变与 User 模型相关联。在我上面的 Prisma 示例中,解析器中没有提到任何类型。如果我的数据模型中的 MemberA 和 MemberB 具有相同的属性,例如姓名和电子邮件(这是一个人为的示例),我的解析器 createMember 将如何知道与哪个关联?
猜你喜欢
  • 2018-10-20
  • 2016-05-06
  • 2019-06-11
  • 2020-04-21
  • 2021-11-10
  • 2020-07-24
  • 2019-06-12
  • 2021-03-05
  • 2017-04-07
相关资源
最近更新 更多