graphql 错误:在查询中调用字段时,无法为不可为空的字段返回 null

问题描述 投票:0回答:1

当我尝试查询我的memberList解析器时,我收到此错误,它需要返回一个membeTypeID,但它返回null - 如果这有帮助的话,我正在使用Apollo:

    "errors": [
        {
            "message": "Cannot return null for non-nullable field Member.memberType.",
            "locations": [
                {
                    "line": 5,
                    "column": 3
                }
            ],
            "path": [
                "memberList",
                0,
                "memberType"
            ],
            "extensions": {
                "code": "INTERNAL_SERVER_ERROR",
                "stacktrace": [
                    "Error: Cannot return null for non-nullable field Member.memberType.",

这是我的查询:

query MemberList {
    memberList{
        firstName
        id
        memberType{id}
    }
}

这是我使用 typeORM 和 Graphql 的成员实体的片段:

 /** Reference to type of member. */
  @ManyToOne(() => MemberType, (memberType) => memberType.memberType, { eager: true })
  // @JoinColumn({referencedColumnName: 'testing'})
  @Field(() => MemberType)
  memberType!: MemberType;

这里是成员类型实体的片段:

  /** ID number of a member type. */
  @PrimaryGeneratedColumn('increment')
  @Field()
  id!: number;

  /** Type that a member can be. */
  @OneToMany(() => Member, (member) => member.memberType)
  @Field()
  memberType!: string;

这是会员名单:

 /** Get an array of all members  */
  @Query(() => [ Member ], { nullable: true })
  async memberList(): Promise<Member[] | null>{
    const memberList = await Member.find();
    return memberList;
  }

当我尝试运行以下突变的查询时,它也会抛出相同的错误:

  /** Update a member with new details */
  @Mutation(() => Member, {nullable: true })
  async memberUpdate(
    @Arg('input') input: MemberUpdateInput,
    @Ctx() { request }: AppContext
  ): Promise<Member | null> {
    input.throwIfInvalid();
    const { userID } = request.session;
    const existingUser = await User.findOneBy({ id: userID });
    if (!existingUser) {
      throw new AuthenticationError;
    }
    const existingMember = await Member.findOneBy({ id: input.id });
    if (!existingMember) {
      throw new FormError({
        control: [ `Member '${input.firstName} ${input.lastName}' does not exist!` ]
      });
    }
    const memberTypeInput = new IdNumberInput();
    memberTypeInput.id = input.memberType.id;
    const memberType = await new MemberTypeResolver().memberTypeDetails(memberTypeInput);
    await Member.update({ id: input.id }, {
      firstName: input.firstName,
      githubUrl: input.githubUrl,
      lastName: input.lastName,
      linkedinUrl: input.linkedinUrl,
      memberType: memberType,
      personalUrl: input.personalUrl,
      photoUrl: input.photoUrl
    });
    const updatedMember = await Member.findOneBy({ id: input.id });
    Member.save;
    console.log(updatedMember?.memberType);
    if (!updatedMember) {
      throw new ServerError;
    }

    return updatedMember;
  }

这是我给出的输入

{
    "input": {
        "id": "48b76f72-1348-4708-8d09-471cc82def13",
        "firstName": "foob",
        "lastName": "bar",
        "memberType": {
            "id": 2
        },
        "photoUrl": "testingPhoto"
    }
}

这是输入类型:

@InputType()
export class MemberUpdateInput extends UuidInput {
  @Field()
  firstName!: string;

  @Field(() => String, { nullable: true })
  githubUrl?: string;

  @Field()
  lastName!: string;

  @Field(() => String, { nullable: true })
  linkedinUrl?: string;

  @Field(() => IdNumberInput)
  memberType!: IdNumberInput;

  @Field(() => String, { nullable: true })
  personalUrl?: string;

  @Field()
  photoUrl!: string;

我已将 memberType 设置为可选,只是为了查看它给出的内容并返回 null,我还尝试将 Member 实体中的 memberType 设为与表 OneToOne 的数字,但这也不起作用。

看起来memberType没有被拉入findbyOne或find中,这是updatedMember返回的内容:

Member {
  createdAt: 2023-10-07T09:56:27.589Z,
  firstName: 'testin',
  githubUrl: null,
  id: '8c636b7b-4d83-4681-a912-87aee5a95c2e',
  lastName: 'bar',
  linkedinUrl: null,
  personalUrl: null,
  photoUrl: 'testThing',
  updateAt: 2023-10-07T09:56:27.589Z,
  memberType: MemberType {
    createdAt: 2023-10-07T09:21:01.670Z,
    id: 1,
    updateAt: 2023-10-07T09:21:01.670Z
  }
}

这是memberList[0]:

Member {
  createdAt: 2023-10-07T09:56:27.589Z,
  firstName: 'testin',
  githubUrl: null,
  id: '8c636b7b-4d83-4681-a912-87aee5a95c2e',
  lastName: 'bar',
  linkedinUrl: null,
  personalUrl: null,
  photoUrl: 'testThing',
  updateAt: 2023-10-07T09:56:27.589Z,
  memberType: MemberType {
    createdAt: 2023-10-07T09:21:01.670Z,
    id: 1,
    updateAt: 2023-10-07T09:21:01.670Z
  }
}

typescript graphql typeorm apollo typegraphql
1个回答
0
投票

好吧,我将 OneToMany 关系放在成员类型实体中的错误列上:

这是更新后的 MemberType 实体

  /** ID number of a member type. */
  @PrimaryGeneratedColumn('increment')
  @OneToMany(() => Member, (member) => member.memberType)
  @Field()
  id!: number;

  /** Type that a member can be. */
  @Column()
  @Field()
  memberType!: string;

这是会员实体memberType 列:

  /** Reference to type of member. */
  @ManyToOne(() => MemberType, (memberType) => memberType.memberType, { eager: true })
  @JoinColumn({name: 'memberTypeID'})
  @Field(() => MemberType)
  memberType!: MemberType;

这是我现在查询数据的方式:

query MemberList {
    memberList{
        firstName
        id
        memberType{
            memberType
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.