Graphql Dataloader文件结构和上下文

时间:2019-03-22 20:09:21

标签: node.js graphql

让我通过说我不是一名JavaScript开发人员来开头这行,因此我可能缺少一些显而易见的东西。我是一名数据仓库开发人员,正在创建一个可以与我们的DW通信的graphql服务器。

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

我正在尝试使用与我的模型类似的加载器模式,将每个加载器分解为一个单独的文件,然后通过递归遍历文件结构将其合并为单个对象。

示例是我有一个称为加载器的对象,其中包含两个加载器:countryLoader和marketsectorLoader,它们分别在“ 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)  }},

此函数可以正常工作,批处理并返回正确的查询结果,但是我不希望不必从加载器对象中声明每个特定的数据加载器作为上下文的一部分。但是,我一直无法弄清楚在上下文中使用加载程序对象并调用适当的语法。 适当解析器中的单个数据加载器。

我尝试了以下示例的几种变体: 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(),
  },

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

1 个答案:

答案 0 :(得分:0)

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

user_room_name

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

import * as loaders from './loaders'

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

// 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
}, {})