Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重用GraphQL单个查询API来获取列表?_Javascript_Node.js_Graphql - Fatal编程技术网

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

Javascript 如何重用GraphQL单个查询API来获取列表?,javascript,node.js,graphql,Javascript,Node.js,Graphql,我正试图得到模型的列表 首先,我创建了一个模型查询API。现在我想通过提供id来获取一个列表 我知道我可以在getModelById上使用Promise.all,并对再次得到的每个结果进行一些处理 但是有没有办法重用单个模型查询API?谢谢 const ModelType = new GraphQLObjectType({ name: 'Model', fields: { id: { type: GraphQLString }, // ... } }); const

我正试图得到模型的列表

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

我知道我可以在
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
类型有两个字段--
firstName
lastName
,但是您的模型返回一个名为
name
的字段。您的
doSomeProcessing
只是将该名称拆分为
firstName
lastName

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
调用本身很昂贵……现在我们调用该方法两次而不是一次)。

是的,这是我目前的方式,我只是想知道是否有GraphQL方式,因为GraphQL对我来说仍然有太多的魔力。谢谢你让我知道@洪伯淼补充了一些想法更新了答案:)