【发布时间】:2018-09-26 15:28:31
【问题描述】:
我正在使用 GraphQL,但在寻找将变量从查询传递到结果的最佳方式时遇到了一些麻烦。
我有这样的架构:
type Fragment {
# The id of the fragment
id: String!
# The key of the fragment
key: String!
# The type of component
component_type: String!
# The params used to build the fragment
params: JSON
# Component data
data: JSON
children: [JSON]
items: [JSON]
}
片段是指“cms”片段。解决此问题后,我想将一些查询数据传递到另一个后端。
我的查询如下所示:
query getFragmentsWithItems($keys: [String!]!
$platform: PlatformType
$version: String
$userInfo: UserInput
$userId: Int
) {
fragmentsWithItems(keys: $keys, platform: $platform, version: $version, userInfo: $userInfo, userId: $userId) {
key
data
children
params
items
}
}
问题是:我在 Fragment 的 data 字段中有一些查询数据。在Fragment 解决之前,该数据不可用。我想获取该数据并将其发送到不同的后端。我想用 GraphQL 来做这件事,我希望做这样的事情:
Fragment: () => {
async query(obj, args, context, info, {modles}) => {
const items = await models.getItems(obj.query_string);
}
}
但我需要传递给原始查询的user_info 和user_id。显然,这只能从不打算使用的 info 参数访问。
我采取的另一条路径是使用手动解析器来执行以下操作:
const resolveFI = ({ keys, platform, version, userInfo, userId, models }) => {
if (!keys || !keys.length) {
return Promise.resolve(null);
}
return models.release.get({ platform, version }).then(release =>
Promise.all(
keys.map(key =>
models.fragments.get({
key,
platform,
version,
release: release.id
})
)
).then(data => {
const promises = [];
data.rows.forEach(r => {
if (r.data.query_data) {
const d = {
// Can just ignore
filters: r.data.query_data.filters || {},
user_info: userInfo,
user_id: userId
};
promises.push(
new Promise(resolve => {
resolve(
models.itemSearch.get(d).then(i => ({ items: i.items, ...r }))
);
})
);
}
...etc other backends
这可行,但是手动承诺链似乎违背了使用 GraphQL 的目的。
我尝试的最后一件事是将items 设为非标量类型,类似于:
type Fragment {
items: ItemSearchResult(user_info: UserInput) etc
但由于我无法将 Fragment 中的实际结果通过管道传输到不起作用的 ItemSearchResult。
我意识到这很啰嗦,所以我愿意编辑或澄清。
我正在寻找我是否错过了更好的方法,或者我是否应该将其打包并让客户端应用在获取 Fragment 数据后执行项目查询。
【问题讨论】:
-
您说“我想获取该数据并将其发送到不同的后端”-您是在尝试通过调用另一个 API 来解析
items字段,还是只是尝试发布部分的查询结果到另一个后端? -
第二个。我想将查询 Fragments 得到的信息发布到项目后端。
标签: graphql