Graphql 指定要使用|解析器顺序的解析器
我正在与Apollo一起构建GraphQL服务器。 我遇到了由解析程序的优先级引起的性能问题 我有一个在父类型上解析的子类型。 Apollo Server决定使用子类型解析器,而不是父类型上更快的解析器 查询 安装程序 AdGroupType(父级) 关键字类型(子项) AdGroupResolver.js 关键字解析器.js 在一个广告群中要求1000多个关键词的响应时间非常长 但是,如果我删除关键字解析器上的term和bid函数,性能会更好,因为使用了Ad组解析器中关键字函数的值 如何设计我的模式或配置Apollo以保持这种灵活性,同时在我请求AdGroups关键字时不必单独解析每个关键字?在GraphQL中,每个字段都被解析,并且父字段总是在子字段之前解析(因为父值被传递给子字段的解析程序)。如果不提供冲突解决程序,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组解析器中关键字函数的值 如何设计我
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),
}
};