Apollo服务器未在子对象中从Mongoose序列化虚拟属性

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

这是我的打字稿对象(简体):

@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返回null”

我已经知道的内容:

  • 游戏和玩家“ id”字段是由Mongoose创建的“虚拟”字段,作为“ _id”的别名,这是真实属性(我不想在前端操纵_id,我想序列化别名) 。
  • 如果我不询问游戏的玩家,它将起作用。因此Game.id已由我的阿波罗服务器解析器正确序列化。因此,对于此对象,可以正确访问虚拟属性并对其进行序列化。
  • [玩家ID存在,并且虚拟属性在猫鼬侧起作用:如果我执行console.log(mongooseResult [0] .players [0] .id),则可以在控制台中看到我的玩家ID。
  • 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']'。

如果有人对这里发生的事情有所了解,那就太好了!

mongoose graphql apollo-server type-graphql typegoose
1个回答
0
投票

您应该尝试使用_id

如果您确实要使用id(虚拟),则需要将.toJson.toObject.toObject选项一起使用>

{ virtuals: true }
© www.soinside.com 2019 - 2024. All rights reserved.