登录
首页 >  Golang >  Go问答

如何为 GraphQL-go 中实现数据加载器?

来源:stackoverflow

时间:2024-03-23 09:57:29 301浏览 收藏

使用 GraphQL-go 实现数据加载器时,避免每次使用时创建新数据加载器。应在整个请求中使用相同的数据加载器,例如将其存储在请求上下文中。这样,数据加载器可以有效地批处理多个键,从而提高查询性能。

问题内容

我正在使用 golang 的 gqlgen 包,并且正在尝试实现数据加载器。这是我正在使用的数据加载器:https://github.com/graph-gophers/dataloader

我按照教程中的方式完成了所有操作,但我无法将所有键作为键片加载。在 node.js 中,如果我做类似的事情

loader.load(1)
loader.load(3)
loader.load(3)

在批处理函数中,对于键,我将收到一个 [1,3] 数组。然而,在 golang 中,我得到了完全不同的东西。

这是我的字段解析器

func (r *newsresolver) createdby(ctx context.context, obj *models.news) (*models.user, error) {
    loader := newdataloader()

    thunk := loader.load(context.todo(), dataloader.stringkey(obj.createdbyid)) // stringkey is a convenience method that make wraps string to implement `key` interface
    result, err := thunk()
    if err != nil {
        // handle data error
    }

    log.printf("value: %#v", result)
    return nil, nil
}

和一个数据加载器函数

func newdataloader() *dataloader.loader {
    batchfn := func(ctx context.context, keys dataloader.keys) []*dataloader.result {
        var results []*dataloader.result
        fmt.println(keys)
        results = append(results, &dataloader.result{data: keys})
        return results
    }

    loader := dataloader.newbatchedloader(batchfn)
    return loader
}

但是,当我打印按键时,我进入了批处理函数,每次都得到单个输入的切片。类似的东西

[2]
[1]
[3]
[1]
[3]

我想我应该得到类似的东西:[2, 1, 3]


正确答案


每次使用它时,您都会创建一个新的数据加载器 (loader := NewDataLoader())。这使得它毫无用处。

您应该对整个请求使用相同的数据加载器。例如。将其存储在请求上下文中。我发现了一些教程:

本篇关于《如何为 GraphQL-go 中实现数据加载器?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>