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

write field level resolver for a field in user type in graphql

我正在尝试使用 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
}

Prisma 模型 -

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

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
}