如何从2个API查询数据

时间:2020-02-04 17:42:57

标签: graphql gatsby contentful

我已经设置了一个Gatsby客户端,该客户端使用gatsby-source-contentful插件连接到Contentful。我还连接了一个简单的自定义API,该API使用gatsby-source-graphql插件连接。

  • 运行开发服务器时,我可以从操场上的Contentful查询我的页面。
  • 我也可以通过游乐场查询我的自定义API。
  • 因此这两个API都可以正常工作,并且可以与Gatsby正确连接。

我想以编程方式生成一堆页面,其中包含动态部分(参考),作者可以根据需要添加和排序

我确实使用...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)

我不知道我的误解在哪里。因此,我非常感谢任何提示,帮助或示例。

1 个答案:

答案 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类型所在的远程模式中。