在 Apollo GraphQL 中如何访问 Dataloader 中的数据源?
In Apollo GraphQL how to access Datasources inside Dataloader?
我是 GraphQL 的新手,我开始使用 Apollo GraphQL。为了测试这一点,我基本上将 GraphQL 包装在 Star Wars API (SWAPI.dev) 周围。我正在使用 Apollo RESTDataSource 调用 Star Wars API。
在 'People' 资源中有一个 'Planets' 数组,我想使用 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的Resolver如下,
homeworld_planet: (parent, args, { dataSources, homeworldLoader }, info) => {
return homeworldLoader.load(parent.homeworld)
}
非常感谢任何帮助!谢谢!
在数据加载器函数中授予对共享对象的访问权限的通常方法是将它们放入批处理函数的闭包中:
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),
}
};
创建数据加载器时,您现在必须提供数据源。也许一开始就不要依附于数据源模式。
我是 GraphQL 的新手,我开始使用 Apollo GraphQL。为了测试这一点,我基本上将 GraphQL 包装在 Star Wars API (SWAPI.dev) 周围。我正在使用 Apollo RESTDataSource 调用 Star Wars API。 在 'People' 资源中有一个 'Planets' 数组,我想使用 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的Resolver如下,
homeworld_planet: (parent, args, { dataSources, homeworldLoader }, info) => {
return homeworldLoader.load(parent.homeworld)
}
非常感谢任何帮助!谢谢!
在数据加载器函数中授予对共享对象的访问权限的通常方法是将它们放入批处理函数的闭包中:
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),
}
};
创建数据加载器时,您现在必须提供数据源。也许一开始就不要依附于数据源模式。