Typescript 实施';命名空间类型化';NestJS和x2B中的解析器;图形ql

Typescript 实施';命名空间类型化';NestJS和x2B中的解析器;图形ql,typescript,graphql,nestjs,apollo-server,Typescript,Graphql,Nestjs,Apollo Server,我偶然发现了一种在自己的“名称空间”下实现GraphQL变体的方法,以帮助保持全局名称空间整洁。Apollo的常规实现类似于此 const typeDefs = gql` type Mutation { article: ArticleMutations } type ArticleMutations { like: Boolean unlike: Boolean } `; const resolvers = { Mutation: { art

我偶然发现了一种在自己的“名称空间”下实现GraphQL变体的方法,以帮助保持全局名称空间整洁。Apollo的常规实现类似于此

const typeDefs = gql`
type Mutation {
    article: ArticleMutations
  }

  type ArticleMutations {
    like: Boolean
    unlike: Boolean
  }
`;

const resolvers = {
  Mutation: {
    article: () => ({}), // ✨✨✨ magic! which allows to proceed call of sub-methods
  }
  ArticleMutations: {
    like: () => { /* resolver code */ },
    unlike: () => { /* resolver code */ },
  },
};
我决定尝试在用NestJS构建的GraphQLAPI中实现这个模式,但是我似乎遇到了一个绊脚石。我创建了一个
TestResolver
类,它包含一个简单的查询,以及一个名称空间的变体,该变体应该返回嵌套的解析器

@ObjectType()
export class TestMutations {
  constructor(private readonly _testService: TestService) {}

  @Field(() => String)
  test: string;

  @ResolveField(() => Unit, {})
  async create(@Args('input') input: CreateTestInput): Promise<Test> {
    try {
      return await this._testService.create(input);
    } catch (err) {
      this._logger.error(err);
      throw new HttpException('An error occurred when creating the Test', HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

@Resolver(() => Test)
export class TestResolver {
  constructor(private readonly _testService: UnitService) {}

  @Query(() => Test, { name: 'test', nullable: true })
  async getTest(@Args('id') id: Id): Promise<Test> {
    try {
      return await this._testService.get(id);
    } catch (err) {
      this._logger.error(err);
      throw new HttpException('An error occurred when fetching the Test', HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

  @Mutation(() => TestMutations)
  test(): TestMutations {
    return new TestMutations(this._testService);
  }
}
@ObjectType()
导出类测试{
构造函数(私有只读_testService:testService){}
@字段(()=>字符串)
测试:字符串;
@ResolveField(()=>单位,{})
异步创建(@Args('input')输入:CreateTestInput):承诺{
试一试{
返回等待此操作。_testService.create(输入);
}捕捉(错误){
此错误(err);
抛出新的HttpException(“创建测试时出错”,HttpStatus.INTERNAL\u SERVER\u错误);
}
}
}
@分解器(()=>测试)
导出类TestResolver{
构造函数(私有只读_testService:UnitService){}
@查询(()=>Test,{name:'Test',null:true})
异步getTest(@Args('id')id:id):承诺{
试一试{
返回等待此消息。\u testService.get(id);
}捕捉(错误){
此错误(err);
抛出新的HttpException('获取测试时出错',HttpStatus.INTERNAL\u SERVER\u错误);
}
}
@突变(()=>测试突变)
test():test{
返回新的TestMutations(this.\u testService);
}
}
通过一些尝试和错误,我成功地让NestJs构建了上述代码,但是我无法让嵌套的
FieldResolver
s显示出来


这个模式的简单Apollo实现看起来确实使用了一些“神奇”的代码来实现它,所以NestJS的结构肯定不允许我这样做。有人有什么想法吗?

你也可以用Nest.js来实现。我是如何做到的:

  • 我创建了根解析器
  • @Resolver('root'))
    导出类根解析器{
    @查询((返回)=>KBQuery,{name:'kb'})
    kbQuery(){
    返回新的KBQuery();
    }
    @Query((returns)=>UserQuery,{name:'user'})//这里可以是@Mutation
    用户查询(){
    返回新的UserQuery();
    }
    //…此处还有其他根查询和变异
    }