【发布时间】: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