我和我的graphQl一起使用了一个数据词组:
:async function testDataLoader(accountNumber, req, args) {
const dummy = new DataLoader(async accountNumber => {
return new Promise(async (resolve, reject) => {
// rest call
return resolve([<rest result>])
});
});
return dummy.load(accountNumber)
}
export default {
Friends: {
query1: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
query2: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
}
};
当我们查询喜欢:
时Friends {
query1
query2
}
我希望DataLoader只能致电我的REST服务一次。但是,我能够看到我的休息被称为两次。不确定,我在哪里犯错。
问题是,每次您调用 testDataLoader
时,都在创建一个新实例的数据载体实例。您应该根据请求创建一个单个数据加载程序实例(每个您要加载的资源(。这样,每当您致电load
时,您都在与同一缓存进行交互。
您可以做类似:
的事情const dummy = new DataLoader(...);
async function testDataLoader(accountNumber) {
return dummy.load(accountNumber)
}
,这将在您不想这样做的请求之间持续存在数据加载程序。您应该做的是在上下文的一部分中创建数据加载程序实例,每次执行请求时都会重新创建。
const context = async ({ req }) => {
return {
testLoader = new DataLoader(...),
};
},
const server = new ApolloServer({
...
context,
})
然后直接在解析器内致电您的装载机:
query2: async (parent, args, context) => {
const data = await context.testLoader.load(["12121"]);
...
}