在graphql中为用户类型中的字段编写字段级解析器

Posted

技术标签:

【中文标题】在graphql中为用户类型中的字段编写字段级解析器【英文标题】:write field level resolver for a field in user type in graphql 【发布时间】:2021-08-23 00:46:45 【问题描述】:

我正在尝试使用 uuid npm 包为用户类型中的 id 字段生成用户 ID。我不确定我应该在哪里以及如何写它。

在我的 createUser 突变中,我只要求用户输入名称和电子邮件的值,而不是 id,因为我希望它由 uuid 包生成,这就是我相信我在createUser 突变。

这是我的 schema.graphql 文件中的内容

type Query 
    users: [User!]!
    user(id: ID!): User!


type Mutation 
    createUser(name: String!, email: String!): User!


type User 
    id: ID!
    name: String!
    email: String!

这是我访问类型的 index.js 文件中的内容 -

const  ApolloServer  = require('apollo-server')
const fs = require('fs');
const path = require('path');
const  PrismaClient  = require('.prisma/client')
const  v4: uuidv4  = require('uuid')

const prisma = new PrismaClient()

const resolvers = 
    Query: 
        //users: () => users
        users: async (parent, args, context, info) => 
            args.test = 'TestContext'
            return await context.prisma.user.findMany()
        ,
        user: async (parent, args, context, info) => 
            return await context.prisma.user.findUnique(
                where: 
                    id: parseInt(args.id)
                ,
            )
        
    ,
    Mutation: 
        createUser: async (parent, args, context, info) => 
            return await context.prisma.user.create(
                data: 
                    id: uuidv4(),
                    name: args.name,
                    email: args.email
                
            )
        
    



const server = new ApolloServer(
    typeDefs: fs.readFileSync(//referencing a file that has the schema definition
        path.join(__dirname, 'schema.graphql'),
        'utf8'
    ),
    //typeDefs: typeDefs,//Testing
    resolvers,
    context: 
        prisma,
    
)
server.listen().then(( url ) =>
    console.log(`Server is running on $url`)
)

这是我执行 createUser 变异调用的方式 -

mutation 
  createUser(name:"test test", email:"test@test.com") 
    id
    name
    email
  

错误信息 -

Invalid `prisma.user.create()` invocation:


  data: 
    id: 'af8a177b-824f-466b-93a5-7f5a1968b3f2',
    ~~
    name: 'test test',
    email: 'test@test.com'
  


Unknown arg `id` in data.id for type userCreateInput. Available args:

type userCreateInput 
  name: String
  email: String

棱镜模型 -

modelmodel user 
  id Int @id @default(autoincrement())
  name String
  email String @unique

【问题讨论】:

这不起作用吗?到目前为止,您实际上还没有问过问题。如果坏了,是什么错误? 对不起,我忘记输入错误了,我已经在原帖中添加了错误。 你是如何定义你的棱镜模型的?这是 Prisma 错误,而不是 GraphQL 错误。 我没有对 prisma 模型进行任何更改,如果我从 id 中删除 uuid 并要求用户输入带有突变的 id,它可以工作。我将棱镜模型附加到原始帖子 【参考方案1】:

UUID 不是Int,因此如果您想使用 UUID,id Int @id @default(autoincrement()) 的 Prisma 架构没有意义。您的parseInt 电话也是如此。如果你想使用 UUID,那么你需要

model user 
  id String @id
  name String
  email String @unique

或者甚至更好,删除你的 id: uuidv4(), 行并执行

model user 
  id String @id @default(uuid())
  name String
  email String @unique

【讨论】:

尝试了第二个选项,我现在收到一条不同的错误消息 - "message": "\nInvalid prisma.user.create() 调用:\n\n\n 字段上的唯一约束失败:(id )", 我的错误,更改主键后没有运行 prisma migrate。这工作感谢loganfsmyth

以上是关于在graphql中为用户类型中的字段编写字段级解析器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 ktor 框架的 graphql-kotlin 进行字段级解析器

如何处理 GraphQL 中的嵌套输入

在 Graphql 中解析类型

Java GraphQL - 将字段值传递给对象的解析器

如何在 GraphQL 中解析来自多个数据源的字段

如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?