Mikro ORM搭配GraphQL查询产品时报非空字段返回null错误如何解决?
问题解决方法
问题根源
你遇到的报错核心原因是Product实体中的category字段使用了Mikro ORM的IdentifiedReference包装类型,但TypeGraphQL的@Field装饰器直接声明返回类型为Category,GraphQL解析时无法直接从Reference代理对象中读取到关联实体的属性,所以返回空值触发非空字段校验报错。
解决方案
你可以根据自己的业务场景选择以下任意一种方案:
方案1:移除IdentifiedReference包装(推荐,适配绝大多数场景)
如果不需要用到Mikro ORM的Reference代理能力(比如懒加载、仅获取关联ID等需求),直接将category字段的类型改为Category即可:
// Product实体中修改category字段定义 @Field(() => Category) @ManyToOne(() => Category) category!: Category
方案2:保留IdentifiedReference,新增字段解析逻辑
如果确实需要使用Reference类型,你可以给@Field装饰器增加resolve回调,主动 unwrap 包装的关联实体:
// Product实体中修改category字段定义 @Field(() => Category, { resolve: (product) => product.category.unwrap() }) @ManyToOne(() => Category) category!: IdentifiedReference<Category>
额外注意事项
你当前的@ManyToOne装饰器没有配置nullable: true,说明业务上每个Product必须绑定一个Category,如果实际场景中存在无分类的产品,需要同步修改字段配置:
// 支持产品无分类的场景 @Field(() => Category, { nullable: true }) @ManyToOne(() => Category, { nullable: true }) category!: Category | null
修改完成后重新运行服务,之前的关联查询逻辑就可以正常返回结果,不会再触发非空字段校验错误。
内容的提问来源于stack exchange,提问作者Pranta
相关产品推荐
相关产品推荐

