首页 > 解决方案 > GraphQL:如何重用“单个对象”解析器来加载相同对象的数组

问题描述

我有两个查询,一个是获取单个项目,一个是获取项目数组

extend type Query{
  allProjects: [Project!]
  oneProject(id:ID!):Project
}

我已经为项目对象字段编写了单独的解析器。我的目标是只加载实际请求的那些字段。我使用了本教程https://medium.com/paypal-tech/graphql-resolvers-best-practices-cd36fdbcef55

export const resolvers: IResolvers = {
  Query: {
    async oneProject(_, { id }) {
      return { id };
    },
  },
  Project: {
    name: async ({ id }) => {
      const { name } = await projectLoader.load(id);
      return name;
    },
    description: async ({ id }) => {
      const { description } = await projectLoader.load(id);
      return description;
    },
    task: async ({ id }) => {
      const { task } = await projectLoader.load(id);
      const resolvedTask = taskLoader.load(task)
      return resolvedTask;
    },

    ...
}

我使用数据加载器,以避免每次执行字段解析器时加载项目。

有了所有这些逻辑,我如何最好地实现第二个查询以获取所有项目?是否有可能将所有项目的 ID 传递给我已经实现的处理单个项目的解析器?如果没有,我将不得不再次实现我为单个解析器实现的相同逻辑。最终目标仍然是仅加载请求的字段而不是所有字段并使用数据加载器。数据加载器很重要,因为我还有其他类型,包括被许多其他人引用的人员类型(我尽量避免多次加载同一个人)。

谢谢你的帮助。

标签: javascriptnode.jsgraphqlgraphql-js

解决方案


推荐阅读