繁体   English   中英

如何重用GraphQL个人查询API来获取列表?

[英]How to reuse GraphQL individual query API to get the list?

我正在尝试获取模型列表。

首先,我创建了一个模型查询API。 现在我想通过提供ids来获得列表。

我知道我可以在getModelById上使用Promise.all并对我再次得到的每个结果进行一些处理。

但是,有没有一种方法可以重用各个模型查询API? 谢谢

const ModelType = new GraphQLObjectType({
  name: 'Model',
  fields: {
    id: { type: GraphQLString },
    // ...
  }
});

const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: () => ({
    model: {
      type: ModelType,
      args: {
        id: { type: GraphQLString }
      },
      resolve(parentValue, args) {
        const { id } = args;
        return getModelById(id).then(model => doSomeProcessing(model));
      }
    },

    models: {
      type: new GraphQLList(ModelType),
      args: {
        ids: { type: new GraphQLList(GraphQLString) }
      },
      resolve(parentValue, args) {
        const { ids } = args;
        // here I know I can use Promise.all on getModelById and do my doSomeProcessing again for each result I got,
        // but is there a way to reuse the model query above? Thanks
      }
    }
  })
});

您不能引用另一个解析器中的现有解析器。 重用逻辑的唯一方法是将其抽象为一个单独的函数,两个解析器都将调用该函数。 例如:

const getProcessedModelById = (id) => {
  return getModelById(id).then(model => doSomeProcessing(model))
}

// model
resolve(parentValue, args) {
  return getProcessedModelById(args.id)
}

// models
resolve(parentValue, args) {
  return Promise.all(args.ids.map(id => getProcessedModelById(args.id)))
}

根据您对模型进行的处理类型的不同,可能可以通过Model类型的字段解析器进行处理。 假设您的Model类型有两个字段firstNamelastName但是您的模型返回一个名为name字段。 您的doSomeProcessing只是采用该名称并将其分解为firstNamelastName

function doSomeProcessing (model) {
  const names = model.name.split(' ')
  return { firstName: names[0], lastName: names[1] }
}

不用这样做,您的解析器可以只返回getModelById返回的任何内容。 然后,您可以将“处理”逻辑封装在每个字段的解析器中:

// firstName field
resolve (parentValue) {
  return parentValue.name.split(' ')[0]
}

// lastName field
resolve (parentValue) {
  return parentValue.name.split(' ')[1]
}

这种方法的优点是,除非客户端请求该字段,否则“处理”实际上不会发生。 在这个非常简单的示例中,解决lastName字段并不昂贵,但是并非总是如此。 它还非常巧妙地封装了从基础数据层派生的字段的逻辑。 但是,它也可能最终变得更昂贵(例如,想象一下,如果split调用本身就很昂贵……现在,我们要两次而不是一次地调用该方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM