指定UsersListResponse.users为可空仍报错:无法为非空字段返回null
解决TypeGraphQL中UsersListResponse.users返回null的报错问题
问题原因
你遇到的错误Cannot return null for non-nullable field UsersListResponse.users,说明GraphQL Schema里users字段被标记为非空,但你实际返回了null。尽管你在@Field装饰器中设置了{ nullable: true },仍可能存在以下问题:
- TypeGraphQL的数组字段可空配置未正确生效
- 返回逻辑中直接将
users赋值为null,而非符合语义的空数组 - TypeScript类型与GraphQL Schema的映射存在偏差
解决方案
方案1:返回空数组替代null(推荐)
从语义上来说,没有用户数据时返回空数组[]比null更合理,也能直接避免该报错。修改Resolver逻辑:
async getUsersList( @Ctx() { req }: AppContext, @Arg("offset", { nullable: true }) offset?: number, @Arg("limit", { nullable: true }) limit?: number, @Arg("orderBy", { nullable: true }) orderBy?: string, @Arg("orderType", { nullable: true }) orderType?: string, ): Promise<UsersListResponse> { // 假设原逻辑中users可能为null let users = await yourDataSource.getUsers(...); // 将null替换为空数组 users = users ?? []; return { users, hasMore: ..., errors: ... }; }
方案2:确保TypeGraphQL正确生成可空字段
检查UsersListResponse的users字段配置,显式指定TypeScript类型匹配可空设置:
@ObjectType() export class UsersListResponse { @Field(() => [FieldError], { nullable: true }) errors?: FieldError[]; @Field(() => [User], { nullable: true }) users?: User[] | null; // 显式允许null值 @Field(() => Boolean, { nullable: true }) hasMore?: boolean; }
方案3:验证Schema生成结果
通过GraphQL Playground或打印生成的Schema,确认users字段的定义是否为[User]?(可空)。如果Schema中仍显示users: [User]!,说明@Field的nullable: true未生效,可尝试:
- 更新TypeGraphQL到最新版本
- 检查是否有其他装饰器或全局配置覆盖了该字段的可空性
内容的提问来源于stack exchange,提问作者Cătălin Avasiloaie
相关产品推荐
相关产品推荐

