【问题标题】:Graphql Dataloader File Structure and ContextGraphql Dataloader 文件结构和上下文
【发布时间】:2019-08-13 21:12:51
【问题描述】:

让我先说我不是 javascript 开发人员,所以我可能遗漏了一些非常明显的东西。我是一名数据仓库开发人员,我正在创建一个可以与我们的 DW 通信的 graphql 服务器。

我一直在尝试通过在上下文中使用包含多个数据加载器的单个对象来让数据加载器在我的 graphql 服务器上工作。然后我试图在解析器中调用适当的数据加载器。但是,我一直无法让它正常工作。仅当我在服务器上下文中单独引用数据加载器时,合并的数据加载器对象才有效。

我试图在加载器上遵循与我的模型类似的模式,每个模型都分解为一个单独的文件,然后通过文件结构的递归合并为单个对象。

例如,我有一个名为 loaders 的对象,它包含两个加载器:countryLoader 和marketectorLoader,每个加载器都定义在“loaders”目录下的单独文件中。在我的服务器上下文中,以下工作

import * as loaders from "./loaders" 
graphQLServer.use('/graphql', bodyParser.json(),  
graphqlExpress({ 
schema,
context: { 
 countryLoader: loaders.countryLoader()

然后我可以在我的解析器中调用它:

 StateProvince: {
Country: (parent, args, {countryLoader}) => {
   countryLoader.load(parent.Country_fkey)  }},

这个功能正确,批处理并返回正确的查询结果,但我不希望将加载器对象中的每个特定数据加载器声明为上下文的一部分。但是,我一直无法弄清楚在上下文中使用 loaders 对象并调用适当的语法 适当的解析器中的单个数据加载器。

我尝试了以下示例的几种变体: https://github.com/relay-tools/react-relay-network-layer/blob/master/examples/dataLoaderPerBatchRequest.js

这似乎正在使用我试图利用的技术类型:

//context snippet:
  context: {
request: req, // just for example, pass request to context
dataLoaders: initDataLoaders(),
  },

但是,没有运气。我怀疑问题出在我的解析器语法上,但我不确定,而且我无法找到具有多个数据加载器的工作示例。

【问题讨论】:

    标签: node.js graphql


    【解决方案1】:

    如果我正确阅读了您的代码,请使用如下通配符导入您的加载器:

    import * as loaders from './loaders'
    

    产生一个对象,其中每个属性都是一个创建特定 DataLoader 实例的函数。所以我们只需要遍历每个属性。例如:

    // Using forEach
    const dataLoaders = {}
    Object.keys(loaders).forEach(loaderName => {
      dataLoaders[loaderName] = loaders[loaderName]()
    })
    
    // Or using reduce
    const dataLoaders = Object.keys(loaders).reduce((result, loaderName) => {
      result[loaderName] = loaders[loaderName]()
      return result
    }, {})
    

    使用lodash,您也可以执行以下操作:

    const dataLoaders = _.mapValues(loaders, loader => loader())
    

    【讨论】:

    • 感谢 Daniel,我会尝试将其集成到我的代码中。我遇到的主要问题是让它识别服务器上下文中的加载程序,而无需显式调用它们,因此我将尝试您概述的不同迭代方法。
    猜你喜欢
    • 2022-11-08
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2020-11-25
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多