type-graphql 使字段解析器异常

type-graphql make exception from Field Resolver

例如,我有以下实体和解析器,

    export class SampleA extends BaseEntity {
      @Field()
      @PrimaryGeneratedColumn()
      id!: number;
    
      @Field()
      @Column()
      title!: string
    
      @Field()
      @Column()
      answer!: string;
     }


    @Resolver(SampleA)
    export class SampleAResolver {

        @FieldResolver(() => String)
        async answer(@Root() sampleA: SampleA, @Ctx() {req}: MyContext) {
            const msg = "answer is not public";
            if(!req.session.userId) return msg;
            return sampleA.answer;
        }
    }

效果很好。只要不满足条件,answer 字段将在整个应用程序中始终为“answer is not public”。不过如果有时候想破例一下,

例如,如果我有以下

@ObjectType()
class ExceptedResponse {
    @Field(() => String, {nullable: true})
    errors?: string;
    @Field(() => SampleA, {nullable: true})
    result?: SampleA;
}

当我尝试 return ExceptedResponse 时,SampleA 字段将始终被 answer @FieldResolver() 过滤,所以我无法获得真正的 answer .

所以我想知道我是否可以在不手动重新创建一个全新字段的情况下将其排除在外,例如

@ObjectType()
class ExceptedResponse {
    @Field(() => String, {nullable: true})
    errors?: string;
    @Field(() => {id: Number, title: String, answer: String }, {nullable: true})
    result?: {id: number, title: string, answer: string };
}

//then I just manually assign each value inside my graphql method

或者理想情况下,如果我可以使 SpecialSampleASampleA 扩展而不受限制。

经过一些随机测试,实现我的目标似乎非常简单。 只需简单地创建一个新的 class,然后将 SampleA 结果分配给它。它由 type-graphql 自动处理并逃避解析字段检查,因为 Class 已更改;

@ObjectType()
class ExceptedSampleA {
  @Field()
  inspiration: string;
  @Field()
  answer: string;
}
//inside response
    @Field(() => ExceptedSampleA, {nullable: true})
    result?: ExceptedSampleA;

//inside graphql method like Mutation() then return response
   const sampleA = SampleA.findOne();
   return { result: sampleA, error: someError }