跨上下文创建的数据加载器缓存(graphQl ApolloServer)
Dataloader caches across context creations (graphQl ApolloServer)
我已将 DataLoaders 集成到我的 graphQL 请求中,但出于某种原因,缓存会跨请求记忆。我可以读到,在 ApolloServer 配置中将函数传递给上下文应该在每个请求上创建一个新的上下文,但由于某种原因,DataLoaders 即使在那时也会被记住。
这是我的代码
阿波罗配置:
export default new ApolloServer({
resolvers,
typeDefs,
context: ({ req, res }) => generateContext(req, res)
});
生成上下文:
const generateContext = (req: Express.Request, res: Express.Response) => ({
...generateLoaders(),
res,
req
});
generateLoaders:
import * as questionLoaders from './questionLoaders';
const generateLoaders = () => ({
questionLoaders
});
问题加载器:
const batchQuestions = async (ids: number[]) => {
const questions = await Question.query().findByIds(ids);
return ids.map((id) => questions.find((q) => q.id === id));
};
export const questionLoader = new dataloader((ids: number[]) => batchQuestions(ids));
您只需调用一次 DataLoader
构造函数,然后将生成的 DataLoader 实例作为常量导出。即使您的上下文函数在每个请求上都被调用,它也会使用导入的值,该值始终是相同的 DataLoader 实例。更改您的导出,使其成为一个函数:
export const createQuestionLoader = () => new dataloader((ids: number[]) => batchQuestions(ids));
然后您可以导入它并调用里面的函数 context
:
import { createQuestionLoader } from '...'
const generateContext = (req: Express.Request, res: Express.Response) => ({
QuestionLoader: createQuestionLoader(),
res,
req
});
我已将 DataLoaders 集成到我的 graphQL 请求中,但出于某种原因,缓存会跨请求记忆。我可以读到,在 ApolloServer 配置中将函数传递给上下文应该在每个请求上创建一个新的上下文,但由于某种原因,DataLoaders 即使在那时也会被记住。
这是我的代码
阿波罗配置:
export default new ApolloServer({
resolvers,
typeDefs,
context: ({ req, res }) => generateContext(req, res)
});
生成上下文:
const generateContext = (req: Express.Request, res: Express.Response) => ({
...generateLoaders(),
res,
req
});
generateLoaders:
import * as questionLoaders from './questionLoaders';
const generateLoaders = () => ({
questionLoaders
});
问题加载器:
const batchQuestions = async (ids: number[]) => {
const questions = await Question.query().findByIds(ids);
return ids.map((id) => questions.find((q) => q.id === id));
};
export const questionLoader = new dataloader((ids: number[]) => batchQuestions(ids));
您只需调用一次 DataLoader
构造函数,然后将生成的 DataLoader 实例作为常量导出。即使您的上下文函数在每个请求上都被调用,它也会使用导入的值,该值始终是相同的 DataLoader 实例。更改您的导出,使其成为一个函数:
export const createQuestionLoader = () => new dataloader((ids: number[]) => batchQuestions(ids));
然后您可以导入它并调用里面的函数 context
:
import { createQuestionLoader } from '...'
const generateContext = (req: Express.Request, res: Express.Response) => ({
QuestionLoader: createQuestionLoader(),
res,
req
});