我已经设置了一个Gatsby客户端,该客户端使用gatsby-source-contentful
插件连接到Contentful。我还连接了一个简单的自定义API,该API使用gatsby-source-graphql
插件连接。
我想以编程方式生成一堆页面,其中包含动态部分(参考),作者可以根据需要添加和排序
。我确实使用...on Node
连接以及我在每个动态部分中定义的片段来实现此目的。到目前为止一切都很好。
我的实际问题:
现在我有一个动态部分,它是一个作业列表。该组件需要从Contentful API中获取数据,因为它存储了诸如纬度和经度之类的值。因此,作者可以自由设置地图上的点并设置半径。我使用组件内部的片段成功地从Contentful中获取了此信息:
export const query = graphql `
fragment JoblistModule on ContentfulJoblisteMitAdresse {
... on ContentfulJoblisteMitAdresse {
contentful_id
radius
geo {
lon
lat
}
}
}`
但是如何将这些信息传递到另一个查询中,该查询从我的自定义API提取作业数据?如果我正确理解了盖茨比,那么我是否必须将这两个API连接在一起?还是可以以某种方式运行另一个查询以获取作为变量传递的这些值?我将如何以及在何处实现这一目标?
我既找不到gatsby-node.js
内部的任何方法(因为传入的上下文只能用作查询内部的变量),也找不到模板文件的任何方法(因为一次只能运行1个查询) ),也不在组件本身中(因为这仅接受staticQuery)
我不知道我的误解在哪里。因此,我非常感谢任何提示,帮助或示例。
答案 0 :(得分:2)
由于您的自定义API是graphQL API,因此您可以使用graphql-tools
包中的delegateToSchema来完成此操作。
您将需要使用Gatsby的setFieldsOnGraphQLNodeType API创建解析器。在此解析器中,您的解析函数将调用delegateToSchema
。
我们有一个类似的问题,我们的博客帖子有一个“作者”字段,其中包含一个ID。然后,我们对另一个系统执行graphQL查询,以通过该ID查找作者信息。
return {
remoteAuthor: {
type: person,
args: {},
resolve: async (source: ContentfulBlogPost, fieldArgs, context, info) => {
if (!source.author) {
return null
}
// runs the selection on the remote schema
// https://github.com/gatsbyjs/gatsby/issues/14517
return delegateToSchema({
schema: authorsSchema,
operation: 'query',
fieldName: 'Person',
args: { id: source.author },
context,
info,
})
},
},
}
这会在我们的博客文章类型中添加一个“ remoteAuthor”字段,并且每当查询该选择时,这些选择就会被代理到person
类型所在的远程模式中。