如何在graphql中重用解析器

时间:2017-05-05 12:50:42

标签: graphql graphql-js apollo

我是graphql的新手,我正在使用graphql创建以下架构

// promotion type

const PromoType = new GraphQLObjectType({
  name: 'Promo',
  description: 'Promo object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the promo'
    },
    title: {
      type: GraphQLString,
      description: 'this is just a test'
    },
    departments: {
      type: new GraphQLList(DepartmentType),
      description: 'departments associated with the promo'
    }
  })
})

和部门类型

// department type

const DepartmentType = new GraphQLObjectType({
  name: 'Department',
  description: 'Department object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the department'
    },
    name: {
      type: GraphQLString,
      description: 'name of the department'
    },
    createdAt: {
      type: GraphQLDate,
      description: 'date the promo is created'
    },
    updatedAt: {
      type: GraphQLDate,
      description: 'date the promo is last updated'
    }
  })
});

以下是解析器

// Promos resolver

const promos = {
  type: new GraphQLList(PromoType),
  resolve: (_, args, context) => {

    let promos = getPromos()
    let departments = getDepartmentsById(promos.promoId)
    return merge(promos, departments)
  }
};


//Departments resolver
const departments = {
  type: new GraphQLList(DepartmentType),
  args: {
      promoId: {
      type: GraphQLID
    }
  },
  resolve: (_, args, context) => {

    return getDepartmentsById(args.promoId)
  }
};

问题是我想使用部门的解析器进入促销的解析器来获得部门。

我可能会遗漏一些显而易见的事情,但有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这是做到这一点的方法。您希望将其视为图形,而不仅仅是单个休止端点。

要获取Promo的数据,您需要像我在此处所做的那样,但对于父节点,如果这是有意义的。因此,在例如viewer已决定您为Promo添加查询。

const PromoType = new GraphQLObjectType({
  name: 'Promo',
  description: 'Promo object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the promo',
    },
    title: {
      type: GraphQLString,
      description: 'this is just a test',
    },
    departments: {
      type: new GraphQLList(DepartmentType),
      description: 'departments associated with the promo',
      resolve: (rootValue) => {
        return getDepartmentsById(rootValue.promoId);
      }
    }
  })
});