【发布时间】:2021-02-23 01:56:45
【问题描述】:
我正在与 Apollo 合作,为我的 GraphQL 请求构建解析器。
为了提高效率,我想获取请求的模型列表(带有各自的嵌套)以及每个模型请求的字段。这样我就可以将此信息传递给sequelize,以便仅在需要时加入模型 - 并且只提取必要的字段。
解析器会在 info 对象中传递此信息。
(obj, args, { models }, info) => ...
从info 对象中,字段、嵌套模型及其各自的选定字段通过此路径公开:
info.fieldNodes[0].selectionSet.selections
我的问题是将这个结构(以我想象的某种递归方式)解析成一个合理的结构,以便我传递给sequelize 查询。
GraphQL 查询示例:
{
getCompany(id: 1) {
id
name
companyOffices {
id
users {
id
title
userLinks {
id
linkUrl
}
}
}
}
}
在info.fieldNodes[0].selectionSet.selections 上生成以下内容(为简洁起见,删除了一些字段):
[
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"id"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"name"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"companyOffices"
},
"selectionSet":{
"kind":"SelectionSet",
"selections":[
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"id"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"users"
},
"selectionSet":{
"kind":"SelectionSet",
"selections":[
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"id"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"title"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"userLinks"
},
"selectionSet":{
"kind":"SelectionSet",
"selections":[
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"id"
}
},
{
"kind":"Field",
"name":{
"kind":"Name",
"value":"linkUrl"
}
}
]
}
}
]
}
}
]
}
}
]
使用这些信息,我想生成如下查询:
const company = await models.Company.findOne({
where: { id: args.id },
attributes: // DYNAMIC BASED ON QUERY
include: // DYNAMIC BASED ON QUERY
});
所以我需要将上面的 GraphQL 查询从上面的 info 对象解析为类似这样的结构:
{
attributes: ["id", "name"],
include: [
{
model: "companyOffices",
attributes: ["id"],
include: [
{
model: users,
attributes: ["id", "title"],
include: [{ model: "userLinks", attributes: ["id", "linkUrl"] }]
}
]
}
]
};
但我不清楚如何通过递归来实现这一点,而不会让事情变得混乱。如果有更简单的方法来实现这种动态include/attributes 我也愿意。
tl;dr - 如何将 Apollo GraphQL 查询的模型和字段转移到 sequelize 查询的 include 和 attributes?
【问题讨论】:
标签: javascript recursion graphql sequelize.js apollo