与Apollo Server嵌套的按字段解析器

时间:2019-07-29 22:30:24

标签: graphql apollo apollo-server

在为正在处理的内容构建解析器时遇到了一些麻烦。我所做的事情与this article所建议的相似,其中我为实体中的每个字段使用单独的解析器。这是我的架构的人为设计版本:

// schema.graphql

type Query {
  service: ServiceInfo
}

type ServiceInfo {
  configuration: ServiceConfiguration
  publicKey: PublicKey
  serverTokenInfo: ServerTokenInfo
}

type ServiceConfiguration {
  platformA: PlatformConfiguration
  platformB: PlatformConfiguration
  platformC: PlatformConfiguration
}

问题是ServiceInfo从不同的数据源解析其每个字段,这很好。我遇到的困难是platformA,platformB和platformC都从不同的数据源解析它们的字段

以下是我目前从事的工作的解析器:

// resolvers.js

export default {
  Query: {
    service: () => ({})
  },
  ServiceInfo: {
    configuration: () => ({}),
    publicKey: (_, args, ctx) => ctx.dataSources.service.getPublicKey(),
    serverTokenInfo: : (_, args, ctx) => ctx.dataSources.service.getTokenInfo(),
  }
}

现在,我需要为configuration写一个解析器。我已经尝试了几件事:

// resolvers.js

export default {
  // ...
  ServiceInfo: {
    configuration: () => ({}),
    // ...
    ServiceConfiguration: {
      platformA:  (_, args, ctx) => ctx.dataSources.service.getConfig("A"),
      platformB:  (_, args, ctx) => ctx.dataSources.service.getConfig("B"),
      platformC:  (_, args, ctx) => ctx.dataSources.service.getConfig("C"),
    }
  }
}

失败,并告诉我:ServiceInfo.ServiceConfiguration defined in resolvers, but not in schema。我尝试的下一件事是将ServiceConfiguration解析器移到顶层:

// resolvers.js

export default {
  // ...
  ServiceInfo: {
    // ...
  }
  ServiceConfiguration: {
    platformA:  (_, args, ctx) => ctx.dataSources.service.getConfig("A"),
    platformB:  (_, args, ctx) => ctx.dataSources.service.getConfig("B"),
    platformC:  (_, args, ctx) => ctx.dataSources.service.getConfig("C"),
  }
}

...现在失败了,并告诉我ServiceConfiguration defined in resolvers, but not in schema,我没有主意了。如果有人有见识,我会真的感激不已,我很受困扰。

0 个答案:

没有答案