Graphql 指定要使用|解析器顺序的解析器

Graphql 指定要使用|解析器顺序的解析器,graphql,apollo,graphql-js,apollo-server,Graphql,Apollo,Graphql Js,Apollo Server,我正在与Apollo一起构建GraphQL服务器。 我遇到了由解析程序的优先级引起的性能问题 我有一个在父类型上解析的子类型。 Apollo Server决定使用子类型解析器,而不是父类型上更快的解析器 查询 安装程序 AdGroupType(父级) 关键字类型(子项) AdGroupResolver.js 关键字解析器.js 在一个广告群中要求1000多个关键词的响应时间非常长 但是,如果我删除关键字解析器上的term和bid函数,性能会更好,因为使用了Ad组解析器中关键字函数的值 如何设计我

我正在与Apollo一起构建GraphQL服务器。 我遇到了由解析程序的优先级引起的性能问题

我有一个在父类型上解析的子类型。 Apollo Server决定使用子类型解析器,而不是父类型上更快的解析器

查询 安装程序 AdGroupType(父级) 关键字类型(子项) AdGroupResolver.js 关键字解析器.js 在一个广告群中要求1000多个关键词的响应时间非常长

但是,如果我删除关键字解析器上的term和bid函数,性能会更好,因为使用了Ad组解析器中关键字函数的值

如何设计我的模式或配置Apollo以保持这种灵活性,同时在我请求AdGroups关键字时不必单独解析每个关键字?

在GraphQL中,每个字段都被解析,并且父字段总是在子字段之前解析(因为父值被传递给子字段的解析程序)。如果不提供冲突解决程序,GraphQL将使用默认的冲突解决程序函数,尝试在父值上查找匹配的属性(有关更详细的说明,请参阅)。如果提供解析程序,则每次响应中出现该字段时(如果是列表,则针对列表中的每个项目),解析程序都将始终运行

如果有时父字段已经提供了要解析的值,而有时没有,您只需向解析程序添加一个条件:

export default {
  Keyword: {
    term: ({ id: keywordId, term }, _, { handler }) => term || getKeywordTerm(handler, keywordId),
    bid: ({ id: keywordId, bid }, _, { handler }) => bid || getKeywordBid(handler, keywordId),
  }
};
在GraphQL中,每个字段都被解析,父字段总是在子字段之前解析(因为父值被传递给子字段的解析程序)。如果不提供冲突解决程序,GraphQL将使用默认的冲突解决程序函数,尝试在父值上查找匹配的属性(有关更详细的说明,请参阅)。如果提供解析程序,则每次响应中出现该字段时(如果是列表,则针对列表中的每个项目),解析程序都将始终运行

如果有时父字段已经提供了要解析的值,而有时没有,您只需向解析程序添加一个条件:

export default {
  Keyword: {
    term: ({ id: keywordId, term }, _, { handler }) => term || getKeywordTerm(handler, keywordId),
    bid: ({ id: keywordId, bid }, _, { handler }) => bid || getKeywordBid(handler, keywordId),
  }
};
type Keyword {
  id
  term
  bid
}
// this gets executed
const getKeywords = (handler, adGroupId, filter) => handler.knex.raw(`
  select
   id,
   term,
   bid
  from keyword
  where adGroupId = ${adGroupId}
`);


export default {
  Query: {
    AdGroup: (parent, { id: adGroupId }, { handler }) => getAdGroup(handler, id),
  },
  AdGroup: {
    Keywords: ({ id: adGroupId }, { filter }, { handler }) => getKeywords( handler, adGroupId, filter),
  }
};
// this gets executed as well
const getKeywordTerm = (handler, keywordId) => handler.knex.raw(`
  select
   term
  from keyword
  where keywordId = ${keywordId}
`);

// this gets executed as well
const getKeywordBid = (handler, keywordId) => handler.knex.raw(`
  select
   bid
  from keyword
  where keywordId = ${keywordId}
`);

export default {
  Query: {
    Keyword: (parent, { id: keywordId }, { handler }) => getKeyword(handler, keywordId),
  },
  Keyword: {
    term: ({ id: keywordId }, _, { handler }) => getKeywordTerm(handler, keywordId),
    bid: ({ id: keywordId }, _, { handler }) => getKeywordBid(handler, keywordId),
  }
};
export default {
  Keyword: {
    term: ({ id: keywordId, term }, _, { handler }) => term || getKeywordTerm(handler, keywordId),
    bid: ({ id: keywordId, bid }, _, { handler }) => bid || getKeywordBid(handler, keywordId),
  }
};