在Apollo GraphQL中,如何访问Dataloader中的数据源?

在Apollo GraphQL中,如何访问Dataloader中的数据源?,graphql,apollo,apollo-server,dataloader,Graphql,Apollo,Apollo Server,Dataloader,我是GraphQL新手,我开始使用Apollo GraphQL。为了测试这一点,我将围绕星球大战API(SWAPI.dev)包装GraphQL。我正在使用Apollo RESTDataSource调用星球大战API。 在“人物”资源中有一个“行星”数组,我想使用Dataloader批量加载它 在Dataloader中,我需要能够批处理数据,并且需要使用我的数据源来实际使用批处理获取数据。但是我在Dataloader中找不到访问数据源的方法 我的数据加载程序如下所示 const DataLoade

我是GraphQL新手,我开始使用Apollo GraphQL。为了测试这一点,我将围绕星球大战API(SWAPI.dev)包装GraphQL。我正在使用Apollo RESTDataSource调用星球大战API。 在“人物”资源中有一个“行星”数组,我想使用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);
homeworld_planet: (parent, args, { dataSources, homeworldLoader }, info) => {
      return homeworldLoader.load(parent.homeworld)
    }
阿波罗服务器初始化

const server = new ApolloServer({ 
  schema,
  dataSources: () => ({
    starWarsAPI: new StarWarsAPI()
  }),
  context: () => ({
    homeworldLoader:  homeworldLoader()
  })
});
使用数据加载器的解析器如下所示

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);
homeworld_planet: (parent, args, { dataSources, homeworldLoader }, info) => {
      return homeworldLoader.load(parent.homeworld)
    }

非常感谢您的帮助!谢谢

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

module.exports=函数createDataloaders(数据源){
const batchHomeworlds=async(URL)=>{
const homeworlds=wait dataSources.starWarsAPI.getResourcesBatch(URL);
返回url.map(url=>homeworlds.find(h=>h.url==url));
};
返回{
homeworldLoader:新的数据加载器(batchHomeworlds),
}
};

创建数据加载器时,您现在必须提供数据源。可能一开始就没有连接到数据源模式。

数据加载器是在ApolloServer构造函数的
上下文
回调中创建的,这意味着数据源也必须在那里创建,而不是在
数据源
回调中创建。这会影响数据源的使用方式吗?