You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gqlgen返回GraphQL非空数组为nil触发内部错误的解决需求

解决Gqlgen返回空数组时触发内部错误的问题

问题根源

你定义的[ProcessedFiles!]!是双重非空约束:既要求数组本身不能为null,也要求数组里的每个元素不能为null。当Resolver返回Sources: nil时,直接违反了数组非空的约束,Gqlgen会抛出内部错误。就算你去掉外层的!,如果没重新生成代码或者类型不匹配,依然会报错。

具体解决步骤

  1. 修正Schema定义
    把FileInfo的sources字段改成允许数组为null的形式,保留元素非空的约束:

    type FileInfo {
      # 其他字段...
      sources: [ProcessedFiles!]
    }
    
  2. 重新生成Gqlgen代码
    一定要执行生成命令,让Gqlgen根据新Schema更新结构体和Resolver代码:

    go run github.com/99designs/gqlgen generate
    

    生成后检查FileInfo结构体的sources字段类型,应该是*[]ProcessedFiles(指针类型),这样才能返回nil表示GraphQL中的null。

  3. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:13:11