如何在Nestjs-query中实现游标与偏移分页查询?
问题描述
我正在使用nestjs-query,拥有一个TodoItem实体,希望生成两个查询解析器来获取多条待办事项:一个游标分页查询,一个偏移分页查询。我进行了如下配置:
resolvers: [ { DTOClass: TodoItemDTO, EntityClass: TodoItemEntity, create: { disabled: true }, update: { disabled: true }, delete: { disabled: true }, read: { one: { disabled: true }, many: { name: 'todoItemCursor', }, }, }, { DTOClass: TodoItemDTO, EntityClass: TodoItemEntity, pagingStrategy: PagingStrategies.OFFSET, create: { disabled: true }, update: { disabled: true }, delete: { disabled: true }, read: { one: { disabled: true }, many: { name: 'todoItemOffset', }, }, }, ],
但运行时出现报错:
/Users/valentin/Perso/Projects/reproducible/node_modules/graphql/type/schema.js:219 throw new Error( ^ Error: Schema must contain uniquely named types but contains multiple types named "TodoItemConnection". at new GraphQLSchema (/Users/valentin/Perso/Projects/reproducible/node_modules/graphql/type/schema.js:219:15) at GraphQLSchemaFactory.create (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/schema-builder/graphql-schema.factory.js:38:24) at GraphQLSchemaBuilder.generateSchema (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/graphql-schema.builder.js:35:52) at GraphQLSchemaBuilder.build (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/graphql-schema.builder.js:22:31) at GraphQLFactory.generateSchema (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/graphql.factory.js:27:69) at ApolloDriver.generateSchema (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/drivers/abstract-graphql.driver.js:23:36) at GraphQLModule.onModuleInit (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/graphql/dist/graphql.module.js:109:54) at processTicksAndRejections (node:internal/process/task_queues:95:5) at callModuleInitHook (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9) at NestApplication.callInitHook (/Users/valentin/Perso/Projects/reproducible/node_modules/@nestjs/core/nest-application-context.js:223:13)
我尝试为ReadResolverOpts设置connectionName参数:
read: { connectionName: 'TodoItemOffsetConnection', one: { disabled: true }, many: { name: 'todoItemOffset', }, },
但似乎没有效果。请问如何同时实现游标分页与偏移分页查询?
解决方案
问题核心是两个resolver配置生成了同名的GraphQL连接类型,你之前设置connectionName的位置错误——该参数不属于read配置层级,而是要放在resolver的根配置中,同时需要配合dtoName避免类型冲突。
正确配置示例:
resolvers: [ // 游标分页查询 { DTOClass: TodoItemDTO, EntityClass: TodoItemEntity, create: { disabled: true }, update: { disabled: true }, delete: { disabled: true }, read: { one: { disabled: true }, many: { name: 'todoItemCursor', }, }, }, // 偏移分页查询 { DTOClass: TodoItemDTO, EntityClass: TodoItemEntity, pagingStrategy: PagingStrategies.OFFSET, // 自定义偏移分页的连接类型名称 connectionName: 'TodoItemOffsetConnection', // 自定义偏移分页的DTO类型名称 dtoName: 'TodoItemOffsetDTO', create: { disabled: true }, update: { disabled: true }, delete: { disabled: true }, read: { one: { disabled: true }, many: { name: 'todoItemOffset', }, }, }, ],
通过在resolver根层级设置connectionName和dtoName,可以确保两种分页方式生成的GraphQL类型名称完全唯一,解决重复类型的报错问题,同时保留两个独立的分页查询接口。
内容的提问来源于stack exchange,提问作者Valentin Vignal
相关产品推荐
相关产品推荐

