Сервер Apollo не сериализует виртуальное свойство из Mon goose в подобъектах - PullRequest
0 голосов
/ 16 апреля 2020

Вот мои объекты машинописного текста (упрощенно):

@ObjectType()
export default class Game {
  @Field(() => ID)
  id?: string

  @arrayProp({items: Player})
  @Field(() => [Player])
  players: Player[] = []
}

@ObjectType()
export class Player {
  @Field(() => ID)
  id?: string
}

Он генерирует эту схему, используя type-graphql:

type Game {
  id: ID!
  players: [Player!]!
}
type Player {
  id: ID!
}

Я использую преобразователь для запроса игр пользователя:

@Resolver(() => User)
export class UserGameResolver {
  @FieldResolver(() => [Game])
  async ongoingGames(@Ctx('userId') userId: string) {
    return GameModel.find({'players.userId': userId, setup: null})
  }
}

И выдает эту ошибку: «Ошибка GraphQL: Невозможно вернуть ноль для ненулевого поля Player.id»

Что я уже знаю:

  • Поле «id» для Game and Player - это «виртуальное» поле, созданное Mon goose в качестве псевдонима для «_id», которое является реальным свойством (я не хочу манипулировать _id на внешнем интерфейсе, я хочу сериализовать псевдоним ).
  • Если я не запрашиваю игроков в играх, это работает. Таким образом, Game.id правильно сериализуется моим распознавателем сервера apollo. Таким образом, для этого объекта к виртуальному свойству обращаются и сериализуют должным образом.
  • Идентификатор игрока существует, и виртуальное свойство работает на стороне mon goose: если я сделаю console.log (mongooseResult [0] .players [0] .id), я могу увидеть свой идентификатор игрока в console.
  • Предполагается, что сервер Apollo будет использовать этот преобразователь полей по умолчанию для player.id: https://github.com/graphql/graphql-js/blob/master/src/execution/execute.js#L1181 -L1199 (документация: https://www.apollographql.com/docs/apollo-server/data/resolvers/#default -resolvers ). На основе исходного кода виртуальное свойство должно быть сериализовано, так как к нему обращаются следующим образом: 'player [' id ']'.

Если кто-то знает, что здесь происходит, оно будет будь великим!

1 Ответ

1 голос
/ 18 апреля 2020

вы должны попытаться использовать _id

, если вы действительно хотите использовать id (виртуальный), тогда вам нужно либо использовать .toJson, либо .toObject с параметрами { virtuals: true }

return GameModel.find({'players.userId': userId, setup: null}).toObject({ virtuals: true });
...