Apollo server不会在子对象中序列化Mongoose中的虚拟财产
以下是我的typescript对象(简化): 它使用类型graphql生成此架构: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
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 });