在Apollo GraphQL中,如何访问Dataloader中的数据源?
我是GraphQL新手,我开始使用Apollo GraphQL。为了测试这一点,我将围绕星球大战API(SWAPI.dev)包装GraphQL。我正在使用Apollo RESTDataSource调用星球大战API。 在“人物”资源中有一个“行星”数组,我想使用Dataloader批量加载它 在Dataloader中,我需要能够批处理数据,并且需要使用我的数据源来实际使用批处理获取数据。但是我在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
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构造函数的
上下文
回调中创建的,这意味着数据源也必须在那里创建,而不是在数据源
回调中创建。这会影响数据源的使用方式吗?