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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:52:53