Apollo server不会在子对象中序列化Mongoose中的虚拟财产

Apollo server不会在子对象中序列化Mongoose中的虚拟财产,mongoose,graphql,apollo-server,typegraphql,typegoose,Mongoose,Graphql,Apollo Server,Typegraphql,Typegoose,以下是我的typescript对象(简化): 它使用类型graphql生成此架构: type Game { id: ID! players: [Player!]! } type Player { id: ID! } 我使用解析器查询用户的游戏: @Resolver(() => User) export class UserGameResolver { @FieldResolver(() => [Game]) async ongoingGames(@Ctx('us

以下是我的typescript对象(简化):

它使用类型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错误:不能为不可为null的field Player.id返回null”

我已经知道:

  • 游戏和玩家“id”字段是Mongoose创建的“虚拟”字段,作为不动产“_id”的别名(我不想在前端操纵_id,我想序列化别名)
  • 如果我不询问游戏玩家,它会起作用。所以Game.id由我的apollo服务器解析器正确序列化。因此,对于这个对象,可以正确地访问和序列化虚拟属性
  • 播放器id存在并且虚拟属性在mongoose端工作:如果我执行console.log(mongooseResult[0].players[0].id),我可以在控制台中看到我的播放器id
  • Apollo server假定为player.id:(文档:)使用此默认字段解析器。基于源代码,应该序列化虚拟财产,因为它是通过以下方式访问的:“player['id']”

如果有人知道这里发生了什么,那就太好了

您应该尝试使用
\u id

如果您确实想使用
id
(虚拟),那么您需要使用
.toJson
或使用选项
{virtuals:true}

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

你好谢谢,我确实做到了,而且很管用。但是你知道我为什么不把mongoose DocumentType修饰对象传递给子解析器吗?@RomainF。抱歉,我对类型graphql了解不多,但可能是因为
find
返回
DocumentType | null
或者是因为
toObject
(/
toJson
)删除了类型?
return GameModel.find({'players.userId': userId, setup: null}).toObject({ virtuals: true });