启动graphql-yoga服务器时出现PothosSchemaError: Ref Query未实现
解决Pothos GraphQL启动时"Ref Query has not been implemented"错误
问题场景
使用Pothos GraphQL构建GraphQL API,搭配Prisma ORM及@pothos/plugin-prisma插件,启动graphql-yoga服务器时触发如下错误:
file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/config-store.ts:391 } ^ PothosSchemaError: Ref Query has not been implemented at ConfigStore.onTypeConfig (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/config-store.ts:391:6) at cb (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/config-store.ts:474:3) at pendingActions (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/config-store.ts:446:32) at Array.forEach (<anonymous>) at ConfigStore.typeConfigs [as prepareForBuild] (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/config-store.ts:446:12) at BuildCache.builtTypes [as buildAll] (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/build-cache.ts:172:22) at SchemaBuilder.toSchema (file:///C:/Users/user/Documents/Projects/project1/node_modules/@pothos/core/src/builder.ts:597:11) at file:///C:/Users/user/Documents/Projects/project1/server/schema.ts:5:31 at ModuleJob.run (node:internal/modules/esm/module_job:194:25) [nodemon] app crashed - waiting for file changes before starting...
相关代码文件
builder.ts
import PrismaPlugin from "@pothos/plugin-prisma"; import type PrismaTypes from '@pothos/plugin-prisma/generated'; import { prisma } from "./db.js"; import SchemaBuilder from "@pothos/core"; import {DateResolver} from "graphql-scalars"; export const builder = new SchemaBuilder<{ Scalars: { Date: { Input: Date; Output: Date }; }; PrismaTypes: PrismaTypes; }>({ plugins: [PrismaPlugin], prisma: { client: prisma, }, }); builder.addScalarType("Date",DateResolver,{});
schema.ts
import { builder } from "./builder.js"; import "./models/Job.js"; import "./models/JobCostCode.js"; export const schema = builder.toSchema({});
index.ts
import { createYoga } from 'graphql-yoga' import { createServer } from 'node:http' import { schema } from "./schema.js"; const yoga = createYoga({ schema }); const server = createServer(yoga); server.listen(4000, () => { console.log(' 🚀 Server is running on http://localhost:4000'); });
问题原因
GraphQL规范要求Schema必须包含Query根类型,当前代码中未定义任何Query字段,导致Pothos无法生成有效的Query类型,触发该错误。
解决方案
需要显式定义Query类型并添加至少一个查询字段,有两种实现方式:
方式1:在schema.ts中全局定义Query类型
修改schema.ts,添加Query类型及字段:
import { builder } from "./builder.js"; import "./models/Job.js"; import "./models/JobCostCode.js"; import { prisma } from "./db.js"; // 创建Query根类型并添加字段 builder.queryType({ fields: (t) => ({ // 简单测试字段 hello: t.string({ resolve: () => "Hello World!", }), // 基于Prisma的查询字段 allJobs: t.prismaField({ type: ["Job"], resolve: (query) => prisma.job.findMany({ ...query }), }), }), }); export const schema = builder.toSchema({});
方式2:在模型文件中添加查询字段
比如在Job.js中,通过builder.queryField添加针对Job的查询:
import { builder } from "../builder.js"; // 先定义Job类型 builder.prismaObject("Job", { fields: (t) => ({ id: t.exposeID("id"), name: t.exposeString("name"), // 其他字段... }), }); // 添加查询字段 builder.queryField("job", (t) => t.prismaField({ type: "Job", args: { id: t.arg.id({ required: true }), }, resolve: (query, _, { id }) => prisma.job.findUnique({ ...query, where: { id }, }), }) );
完成以上修改后,重新启动服务器即可解决该错误。
内容的提问来源于stack exchange,提问作者Hariharan
相关产品推荐
相关产品推荐

