Golang GraphQL 数组类型返回

问题描述 投票:0回答:1

我有这种类型的 GraphQL 模式

type FileInfo {
    fileId: Int!
    sources:  [ProcessedFiles!]!
}

type ProcessedFiles {
    filename:     String!
    url: String!
    type:   String!
    quality: String!
}

type Episode{
    id: Int!
    position: Int!
    seriesId: Int!
    seriesName: String!
    seasonId: Int!
    seasonName: String!
    name: String!
    description: String!
    duration: Int!
    images: MovieImage!
    episodeLanguages: [LanguageWithDescription!]!
    languages: [Language!]!
    warnings: [Warning!]!
    status: Int!
    mediaInfo: [MediaInfo!]!
    note: String!
    fileInfo: FileInfo!
    transcodeStatus:[TranscodeStatus!]!
}

type Query{
    getEpisodesOfSeason(seasonId: Int!): [Episode!]!
}

这是我的 gqlgen.yml

models:
  Episode:
    fields:
      episodeLanguages:
        resolver: true
      languages:
        resolver: true
      warnings:
        resolver: true
      mediaInfo:
        resolver: true
      fileInfo:
        resolver: true
      transcodeStatus:
        resolver: true

它为我每个人生成额外的解析器。就像下面的代码:

func (e episodeResolver) FileInfo(ctx context.Context, obj *models.Episode) (*models.FileInfo, error) {
    fileInfo, err := e.Services.Movie.GetFileInfoByMovieId(obj.ID)
    if err != nil {
        return nil, err
    }
    return fileInfo, nil
}

e.Services.Movie.GetFileInfoByMovieId(obj.ID)

func (m *MovieService) GetFileInfoByMovieId(movieId int) (*models.FileInfo, error) {
    fileInfo, err := m.repos.Movie.GetFileInfoByMovieId(movieId)
    if err != nil {
        return nil, err
    }
    return fileInfo, nil
}

m.repos.Movie.GetFileInfoByMovieId(movieId)

func (m *MoviePostgres) GetFileInfoByMovieId(movieId int) (*models.FileInfo, error) {
    var fileId int
    query := `select id from files where movie_id=$1`
    err := m.db.QueryRow(query, movieId).Scan(&fileId)
    if errors.Is(err, sql.ErrNoRows) {
        return &models.FileInfo{
            FileID:  0,
            Sources: nil,
        }, nil
    }
    if err != nil {
        return nil, err
    }

    var processedFiles *models.MoviesSources
    var processedFilesString string

    query = `select tf.data from transcode_files as tf where movie_id=$1`
    err = m.db.QueryRow(query, movieId).Scan(&processedFilesString)
    if err != nil && !errors.Is(err, sql.ErrNoRows) {
        return nil, err
    }
    err = json.Unmarshal([]byte(processedFilesString), &processedFiles)

    return &models.FileInfo{
        FileID:  fileId,
        Sources: processedFiles.Sources,
    }, nil

}

// this is structure of MoviesSources above
//type MoviesSources struct {
//  Sources []*ProcessedFiles `json:"sources"`
//}

当代码从下面的 if 语句返回时,Gqlgen 会抛出内部系统错误。但我的代码没有返回错误。我尝试全部删除!来自架构。但它也会在 gqlgen 上引发错误。

if errors.Is(err, sql.ErrNoRows) {
        return &models.FileInfo{
            FileID:  0,
            Sources: nil,
        }, nil
    }

我想得到这样的回复:

“文件信息”:{ “文件ID”:12345, “来源”:空 } 如果 fileInfo 字段中数据库中没有行。

go pointers graphql gqlgen
1个回答
0
投票

当没有源时,您应该返回一个 空切片 而不是

nil

© www.soinside.com 2019 - 2024. All rights reserved.