假设使用 library 构建了以下类型的 graphql 模式nexus-prisma
:
- Root : 包含 A 的 id 和列表
- A : 包含 B 的 id 和列表
- B : 包含 C 的 id 和列表
- C : 包含 id
我有一个这样构建的graphqlServer:
import { GraphQLServer } from 'graphql-yoga';
import { prisma } from '../generated/prisma-client';
const server = new GraphQLServer({
schema,
context: (request) => ({ request, prisma })
});
和一个用户定义的解析器:
const Query = prismaObjectType({
name: 'Query',
definition: (t) => {
t.field('aWithABC', {
type: 'Root',
args: {},
list: true,
resolve: async (parent, args, ctx) => {
// The following line returns everything I need within 50ms
return ctx.prisma.roots().$fragment('{ id A { id B { id C { id } } } }')
}
}
})
当我使用路由“aWithABC”和{ id A { id B { id C { id } } } }
解析器中的片段调用服务器时,解析器非常快,并且只对我的 PosgreSQL 服务器执行一个请求,这很棒。
我的问题是,不久之后,graphql 模块向 PostreSQL 发出数百个请求来解析嵌套字段,这需要几秒钟,而它所需要的只是解析器的结果。
有没有办法告诉 graphql 模块在我的解析器之后不需要执行更多请求?
为什么 graphql 模块发出数百个请求,而它只能使用正确的片段调用“prisma.roots()”?
编辑:包的版本:
graphql: "^14.6.0"
graphql-yoga: "^1.18.3"
nexus": "^0.11.7"
nexus-prisma: "^0.3.7"
prisma-client-lib: "^1.34.10"
and my prisma server is running on a docker with image prismagraphql/prisma:1.34