GraphQL类型解析field1 listRecords,field2记录的数量

时间:2018-01-06 03:52:24

标签: node.js types graphql

我试图弄清楚如何解决这样的类型定义:

const xType = new GraphQLObjectType({
    name: 'SysCountry',
    description: 'SysCountry API',
    fields: () => ({
        states: {
            type: new GraphQLList(sysCountryStateType),
            resolve(sysCountry) {
                const { _id } = sysCountry;
                return SysCountryStateModel.find({ sysCountryId: _id }).exec();
            }
        },
        statesQuantity: {
            type: GraphQLInt,
            resolve(sysCountry) {
                const { _id } = sysCountry;
                return SysCountryStateModel.count({ sysCountryId: _id }).exec();
            }
});

其中a字段表示记录列表,另一个字段表示记录列表。是否有较少的资源来避免查询两次或更多次并从一个独特的点解决这个问题?总是返回一个简单的对象(在数量的情况下是int)而不是包含它的几个子字段的一个复合(比如同时返回字段列表和数量)。

换句话说,有没有办法解决statesQuantity而不再次查询?

由于

1 个答案:

答案 0 :(得分:0)

我假设xType是一个孩子,在你的父母身上,显然你只传递了xType上的id字段,你可能想要考虑的是异步获取你需要的父数据,IF在一个请求上,它不是& #39; t包含孩子所需的数据,例如:

// in this child, we destructure fields we need on the root, not {id}
const GraphQLChild = new GraphQLObjectType({
  name: 'Child',
  fields: () => ({
    id: globalIdField('News'),
    userRate: {
      type: new GraphQLObjectType({
        name: 'userRate',
        fields: {
          rate: {
            type: GraphQLInt,
            defaultValue: 0,
            resolve: ({rate}) => rate
          },
          important: {
            type: GraphQLBoolean,
            defaultValue: false,
            resolve: ({important}) => important
          },
          saved: {
            type: GraphQLBoolean,
            defaultValue: false,
            resolve: ({saved}) => saved
          }
        }
      }),
      resolve: ({userRate}) => userRate
    },
    title: {
      type: GraphQLString,
      resolve: ({title}) => title
    },
}),
  interfaces: [nodeInterface]
});

这是您要执行异步提取的父级,IF在一个请求中,它不包含您在子级中需要的数据,因此解析包含您要在其上解析的所有字段的对象孩子:

const GraphQLParent = new GraphQLObjectType({
  name: 'Parent',
  fields: () => ({
    child: {
      type: GraphQLChild,
      resolve: async(root, args, context) => {
        const {childId} = root;
        const childData = await getChildTitle(childId).then(response => {
         const {title} = response.data;
         const userRate = await getChildUserRate(childId);
         return new xType({userRate: {...userRate}, title});
        })
      },
    }
  })
});

在更复杂的场景中,考虑使用类构造函数,以便更容易设想要创建的对象的字段,在中继中用于解析对象类型的对象类型。 nodeDefinitions中的实例,例如:

class xType { 
  constructor({
    userRate,
    title
  }) {
    this.userRate = userRate;
    this.title = title;
  }
}

因此所有提取都发生在父级上,然后您只需解析子级上的字段。