我有这种类型的 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 字段中数据库中没有行。
当没有源时,您应该返回一个 空切片 而不是
nil
。