You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跟随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类型。

具体修复步骤:

  1. 在user.ts顶部导入profile.ts,确保Profile类型先被注册到builder中:
    // user.ts开头添加
    import './profile'
    
  2. 检查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
    }
    
  3. 对应地,在User的profile字段定义中加上nullable: true,匹配模型的可选关系:
    // user.ts中修改
    profile: t.relation('profile', { nullable: true }),
    

完成以上步骤后,重新启动服务即可解决报错。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:34:53