Node.js Graphql数据加载器文件结构和上下文

Node.js Graphql数据加载器文件结构和上下文,node.js,graphql,Node.js,Graphql,让我先说一句,我不是javascript开发人员,所以我可能遗漏了一些非常明显的东西。我是一名数据仓库开发人员,创建了一个可以与DW通信的graphql服务器,这让我很失望 我一直试图通过在上下文中使用一个包含多个数据加载器的对象,让数据加载器在我的graphql服务器上工作。然后我尝试调用解析器中相应的数据加载器。然而,我一直无法让它正常工作。只有在我单独引用服务器上下文中的数据加载器时,合并数据加载器对象才起作用 我试图在加载程序中遵循与我的模型类似的模式,每个加载程序都被分解成一个单独的文

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

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

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

例如,我有一个名为loaders的对象,它包含两个Loader: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)  }},
这可以正确运行,批处理并返回正确的查询结果,但我不希望必须将loaders对象中的每个特定dataloader声明为上下文的一部分。但是,我无法理解在上下文中使用loaders对象并调用适当的 相应解析程序中的单个数据加载器

我尝试了以下示例的几种变体:

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

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

然而,没有运气。我怀疑问题在于我的解析器语法,但我不确定,而且我还没有找到多个数据加载程序的工作示例

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

import * as loaders from './loaders'
结果生成一个对象,其中每个属性都是创建特定数据加载器实例的函数。所以我们只需要遍历每个属性。例如:

// 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
}, {})
使用,您还可以执行以下操作:

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

如果我正确读取了您的代码,请使用通配符导入,如下所示:

import * as loaders from './loaders'
结果生成一个对象,其中每个属性都是创建特定数据加载器实例的函数。所以我们只需要遍历每个属性。例如:

// 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
}, {})
使用,您还可以执行以下操作:

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

谢谢Daniel,我将尝试将其集成到我的代码中。我遇到的主要问题是如何在不显式调用的情况下识别服务器上下文中的加载程序,因此我将尝试您概述的不同迭代方法。谢谢Daniel,我将尝试将其集成到我的代码中。我遇到的主要问题是让它在不显式调用的情况下识别服务器上下文中的加载程序,因此我将尝试您概述的不同迭代方法。