GraphQLError: ID не может представлять значение: " - PullRequest
1 голос
/ 03 августа 2020

У меня есть basi c Nest js - Mon goose - Graphql api, у меня определены две схемы: User и Event

//USER Schema
@Schema()
export class User extends Document {
  @Prop()
  username: string;

  @Prop({ required: true })
  password: string;

  @Prop({ required: true, unique: true })
  email: string;

  @Prop({ required: true, unique: true })
  handle: string;

  @Prop()
  avatar: string;
}

export const UserSchema = SchemaFactory.createForClass(User);
//EVENT schema
@Schema()
export class Event extends Document {
  @Prop({
    type: MongooseSchema.Types.ObjectId,
    ref: User.name,
    required: true,
  })
  creator: GqlUser;

  @Length(5, 30)
  @Prop({ required: true })
  title: string;

  @Length(5, 200)
  @Prop({ required: true })
  description: string;

  @Prop()
  createdDate: string;

  @Prop()
  public: boolean;

  @Prop()
  active: boolean;
}

export const EventSchema = SchemaFactory.createForClass(Event);

В EventSchema, поле creator набирается как MongooseSchema.Types.ObjectId, указывающее на User

My events.resolvers.ts выглядит так:


@Resolver(of => GqlEvent)
export class EventsResolvers {
  constructor(private eventsService: EventsService) {}

  @Query(returns => [GqlEvent])
  async events() {
    return this.eventsService.findAll();
  }

  @Mutation(returns => GqlEvent)
  async createEvent(
    @Args('createEventInput') createEventInput: CreateEventDto,
  ) {
    return this.eventsService.create(createEventInput);
  }
}

событие Dtos:

@ObjectType()
export class GqlEvent {
  @Field(type => ID)
  id: string;

  @Field(type => GqlUser)
  creator: GqlUser;

  @Field()
  title: string;

  @Field()
  description: string;

  @Field()
  createdDate: string;

  @Field()
  public: boolean;

  @Field()
  active: boolean;
}

@InputType()
export class CreateEventDto {
  @Field(type => ID)
  creator: GqlUser;

  @Field()
  @Length(5, 30)
  title: string;

  @Field()
  @Length(5, 200)
  description: string;

  @Field()
  @IsBoolean()
  public: boolean;
}

Таким образом, Nest js генерирует следующую схему gql (для ясности я пропускаю части, связанные с пользовательским CRUD):

# ------------------------------------------------------
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
# ------------------------------------------------------

type GqlUser {
  id: ID!
  username: String!
  handle: String!
  avatar: String!
  email: String!
}

type GqlEvent {
  id: ID!
  creator: GqlUser!
  title: String!
  description: String!
  createdDate: String!
  public: Boolean!
  active: Boolean!
}

type Query {
  events: [GqlEvent!]!
}

type Mutation {
  createEvent(createEventInput: CreateEventDto!): GqlEvent!
}


input CreateEventDto {
  creator: ID!
  title: String!
  description: String!
  public: Boolean!
}

Что работает: мутация createEvent правильно вставляет документ в база данных:

{
"_id":{"$oid":"5f27eacb0393199e3bab31f4"},
"creator":{"$oid":"5f272812107ea863e3d0537b"},
"title":"test event",
"description":"a test description",
"public":true,
"active":true,
"createdDate":"Mon Aug 03 2020",
"__v":{"$numberInt":"0"}
}

Моя проблема: у меня возникает следующая ошибка, когда я пытаюсь запросить подполя creator:

Запрос Gql:

query {
  events {
    id
    creator {
      id
    }
    createdDate
    public
    description
    title
    active
  }
}

Ответ:

"errors": [
    {
      "message": "ID cannot represent value: <Buffer 5f 27 28 12 10 7e a8 63 e3 d0 53 7b>",
      "locations": [
        {
          "line": 6,
          "column": 7
        }
      ],
      "path": [
        "createEvent",
        "creator",
        "id"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "message": "ID cannot represent value: <Buffer 5f 27 28 12 10 7e a8 63 e3 d0 53 7b>",
          "stacktrace": [
            "GraphQLError: ID cannot represent value: <Buffer 5f 27 28 12 10 7e a8 63 e3 d0 53 7b>",...

Поскольку он отлично работает, когда я опускаю поле creator, я понимаю, что mon goose MongooseSchema.Types.ObjectId вызывает проблему со схемой gql ... но я не смог найти подходящий способ исправить это . Заранее спасибо за помощь

1 Ответ

1 голос
/ 05 августа 2020

Это действительно было связано с тем, что поле creator не было заполнено.

Изменение с

async findAll(): Promise<Event[]> {
    return this.eventModel
      .find()
      .exec();
  }

на

async findAll(): Promise<Event[]> {
    return this.eventModel
      .find()
      .populate('creator')
      .exec();
  }

Исправлена ​​моя проблема . Сообщение об ошибке вводило в заблуждение.

...