跟随Prisma GraphQL示例添加Profile关联字段遇PothosSchemaError
问题描述
我正在跟随Prisma官方的TypeScript GraphQL示例开发,完成2.1步骤(为User对象类型添加profile字段)及2.2步骤(添加createProfile GraphQL mutation)后代码报错,移除User中的profile字段则恢复正常。
报错信息
PothosSchemaError: Ref ObjectRef has not been implemented at new PothosError (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\errors.ts:7:5) at new PothosSchemaError (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\errors.ts:14:5) at ConfigStore.getTypeConfig (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\config-store.ts:289:13) at BuildCache.getType (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:444:41) at BuildCache.getOutputType (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:458:23) at BuildCache.buildOutputTypeParam (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:283:36) at BuildCache.buildFields (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:345:20) at BuildCache.getObjectFields (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:410:31) at BuildCache.getFields (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:425:19) at fields (C:\prisma_postgresql_api\typescript_graphql\node_modules@pothos\core\src\build-cache.ts:558:26) [ERROR] 13:55:21 PothosSchemaError: Ref ObjectRef has not been implemented
相关代码
profile.ts
import { builder } from "../builder"; import { prisma } from '../db' import { UserUniqueInput } from './user'; builder.prismaObject('Profile', { fields: (t) => ({ id: t.exposeInt('id'), bio: t.exposeString('bio', { nullable: true }), user: t.relation('user'), }), }) builder.mutationField('createProfile', (t) => t.prismaField({ type: 'Profile', args: { bio: t.arg.string({ required: true }), data: t.arg({ type: UserUniqueInput }) }, resolve: async (query, _parent, args, _context) => prisma.profile.create({ ...query, data: { bio: args.bio, user: { connect: { id: args.data?.id || undefined, email: args.data?.email || undefined } } } }) }) )
user.ts
import { builder } from '../builder' import { prisma } from '../db' import { PostCreateInput } from './post' builder.prismaObject('User', { fields: (t) => ({ id: t.exposeInt('id'), name: t.exposeString('name', { nullable: true }), email: t.exposeString('email'), posts: t.relation('posts'), profile: t.relation('profile'), }), }) export const UserUniqueInput = builder.inputType('UserUniqueInput', { fields: (t) => ({ id: t.int(), email: t.string(), }), }) const UserCreateInput = builder.inputType('UserCreateInput', { fields: (t) => ({ email: t.string({ required: true }), name: t.string(), posts: t.field({ type: [PostCreateInput] }), }), }) builder.queryFields((t) => ({ allUsers: t.prismaField({ type: ['User'], resolve: (query) => prisma.user.findMany({ ...query }), }), })) builder.mutationFields((t) => ({ signupUser: t.prismaField({ type: 'User', args: { data: t.arg({ type: UserCreateInput, required: true, }), }, resolve: (query, parent, args) => { return prisma.user.create({ ...query, data: { email: args.data.email, name: args.data.name, posts: { create: (args.data.posts ?? []).map((post) => ({ title: post.title, content: post.content ?? undefined, })), }, }, }) }, }), }))
解决方案
这个错误源于类型依赖加载顺序问题:user.ts中引用了Profile类型,但profile.ts的加载顺序在user.ts之后,导致Pothos构建User类型时找不到已定义的Profile类型。
具体修复步骤:
- 在
user.ts顶部导入profile.ts,确保Profile类型先被注册到builder中:// user.ts开头添加 import './profile' - 检查Prisma Schema中User与Profile的关系定义,确保User的profile字段是可选的(用户可能未创建Profile),Prisma模型应类似:
model User { id Int @id @default(autoincrement()) name String? email String @unique posts Post[] profile Profile? } model Profile { id Int @id @default(autoincrement()) bio String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) userId Int @unique } - 对应地,在User的
profile字段定义中加上nullable: true,匹配模型的可选关系:// user.ts中修改 profile: t.relation('profile', { nullable: true }),
完成以上步骤后,重新启动服务即可解决报错。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

