Вот мои объекты машинописного текста (упрощенно):
@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 ']'.
Если кто-то знает, что здесь происходит, оно будет будь великим!