Gqlgen返回GraphQL非空数组为nil触发内部错误的解决需求
解决Gqlgen返回空数组时触发内部错误的问题
问题根源
你定义的[ProcessedFiles!]!是双重非空约束:既要求数组本身不能为null,也要求数组里的每个元素不能为null。当Resolver返回Sources: nil时,直接违反了数组非空的约束,Gqlgen会抛出内部错误。就算你去掉外层的!,如果没重新生成代码或者类型不匹配,依然会报错。
具体解决步骤
修正Schema定义
把FileInfo的sources字段改成允许数组为null的形式,保留元素非空的约束:type FileInfo { # 其他字段... sources: [ProcessedFiles!] }重新生成Gqlgen代码
一定要执行生成命令,让Gqlgen根据新Schema更新结构体和Resolver代码:go run github.com/99designs/gqlgen generate生成后检查
FileInfo结构体的sources字段类型,应该是*[]ProcessedFiles(指针类型),这样才能返回nil表示GraphQL中的null。调整Resolver返回逻辑
当数据库无记录时,直接给sources赋值为nil即可:func (r *fileInfoResolver) Sources(ctx context.Context, obj *model.FileInfo) (*[]model.ProcessedFiles, error) { files, err := r.db.GetFiles(ctx, obj.ID) if err != nil { return nil, err } if len(files) == 0 { // 返回nil对应GraphQL的null return nil, nil } return &files, nil }或者如果是直接构造
FileInfo对象返回:return &model.FileInfo{ // 其他字段赋值 Sources: nil, }, nil
常见坑点排查
- 如果改了Schema还是报错,先检查生成的代码里
sources是不是指针类型。要是还是[]ProcessedFiles,说明生成命令没生效,检查gqlgen.yml里的模型映射配置,有没有强制指定了类型。 - 别把空切片
[]ProcessedFiles{}当成null返回,空切片在GraphQL里会被解析成[](空数组),而不是你要的null。
内容的提问来源于stack exchange,提问作者Nurmuhammet Täjimyradow
相关产品推荐
相关产品推荐

