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