Apollo 服务器不在子对象中从 Mongoose 序列化虚拟 属性
Apollo server does not serialize virtual property from Mongoose in sub objects
这是我的打字稿对象(简体):
@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 error: Cannot return null for non-nullable field Player.id"
我已经知道的:
- Game and Player "id" 字段是由 Mongoose 创建的 "virtual" 字段作为“_id”的别名,它是真实的 属性(我不想操纵 _id在前端,我想序列化别名)。
- 如果我不查询游戏的玩家,就可以了。所以 Game.id 被我的 apollo 服务器解析器正确序列化了。所以对于这个对象,虚拟 属性 被正确访问和序列化。
- 玩家 ID 存在并且虚拟 属性 在 mongoose 端工作:如果我这样做 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 (documentation: https://www.apollographql.com/docs/apollo-server/data/resolvers/#default-resolvers)。根据源代码,虚拟 属性 应该被序列化,因为它是这样访问的:'player['id']'.
如果有人知道这里发生了什么,那就太好了!
你应该尝试使用 _id
如果你真的想使用 id
(虚拟),那么你需要使用 .toJson
或 .toObject
选项 { virtuals: true }
return GameModel.find({'players.userId': userId, setup: null}).toObject({ virtuals: true });
这是我的打字稿对象(简体):
@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 error: Cannot return null for non-nullable field Player.id"
我已经知道的:
- Game and Player "id" 字段是由 Mongoose 创建的 "virtual" 字段作为“_id”的别名,它是真实的 属性(我不想操纵 _id在前端,我想序列化别名)。
- 如果我不查询游戏的玩家,就可以了。所以 Game.id 被我的 apollo 服务器解析器正确序列化了。所以对于这个对象,虚拟 属性 被正确访问和序列化。
- 玩家 ID 存在并且虚拟 属性 在 mongoose 端工作:如果我这样做 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 (documentation: https://www.apollographql.com/docs/apollo-server/data/resolvers/#default-resolvers)。根据源代码,虚拟 属性 应该被序列化,因为它是这样访问的:'player['id']'.
如果有人知道这里发生了什么,那就太好了!
你应该尝试使用 _id
如果你真的想使用 id
(虚拟),那么你需要使用 .toJson
或 .toObject
选项 { virtuals: true }
return GameModel.find({'players.userId': userId, setup: null}).toObject({ virtuals: true });