【问题标题】:In Apollo GraphQL how to access Datasources inside Dataloader?在 Apollo GraphQL 中如何访问 Dataloader 中的数据源?
【发布时间】:2020-10-16 18:54:08
【问题描述】:

我是 GraphQL 的新手,我开始使用 Apollo GraphQL。为了测试这一点,我基本上将 GraphQL 包装在 Star Wars API (SWAPI.dev) 周围。我正在使用 Apollo RESTDataSource 来调用 Star Wars API。 在“人物”资源中有一个“行星”数组,我想使用 Dataloader 批量加载它。

在 Dataloader 中,我需要能够对数据进行批处理,并且我需要使用我的数据源通过批处理实际获取数据。但我找不到在 Dataloader 中访问数据源的方法。

我的Dataloader如下,

const DataLoader = require('dataloader');

const batchHomeworlds = async (urls) => {

    // How to access dataSources?
    //homeworlds = await dataSources.starWarsAPI.getResourcesBatch(urls)

    // Hardcoded just for testing
    homeworlds = [{url: 'http://swapi.dev/api/planets/1/', name: 'Test'}]

    const homeworldUrlMap = {};

    homeworlds.forEach(homeworld => {
        homeworldUrlMap[homeworld.url] = homeworld;
    });

    return urls.map(url => homeworldUrlMap[url])
};

module.exports = () => new DataLoader(batchHomeworlds);

Apollo 服务器初始化

const server = new ApolloServer({ 
  schema,
  dataSources: () => ({
    starWarsAPI: new StarWarsAPI()
  }),
  context: () => ({
    homeworldLoader:  homeworldLoader()
  })
});

使用Dataloader的解析器如下,

homeworld_planet: (parent, args, { dataSources, homeworldLoader }, info) => {
      return homeworldLoader.load(parent.homeworld)
    }

非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: graphql apollo apollo-server dataloader


    【解决方案1】:

    在数据加载器函数中访问共享对象的常用方法是将它们放入批处理函数的闭包中:

    module.exports = function createDataloaders(dataSources) {
      const batchHomeworlds = async (urls) => {
        const homeworlds = await dataSources.starWarsAPI.getResourcesBatch(urls);
        return urls.map(url => homeworlds.find(h => h.url === url));
      };
    
      return {
        homeworldLoader: new Dataloader(batchHomeworlds),
      }
    };
    

    创建数据加载器时,您现在必须提供数据源。可能一开始就不要依附于数据源模式。

    【讨论】:

    • 数据加载器是在 ApolloServer 构造函数的 context 回调中创建的,这意味着数据源也必须在那里创建,而不是在 dataSources 回调中创建。这会影响数据源的使用方式吗?
    猜你喜欢
    • 2020-12-14
    • 2021-01-17
    • 1970-01-01
    • 2018-11-06
    • 2020-11-19
    • 2019-06-11
    • 2018-09-14
    • 2018-08-02
    • 2022-11-11
    相关资源
    最近更新 更多