我想用 nestjs 在服务器端缓存我昂贵的 GQL 查询
我关注了 https://docs.nestjs.com/graphql/plugins#using-external-plugins然后https://www.apollographql.com/docs/apollo-server/performance/caching/#caching-with- responsecacheplugin-高级
我还看到了https://github.com/nestjs/graphql/issues/443#issuecomment-599445224这表明它应该按预期工作
我正在使用阿波罗联盟
我遇到的问题是,如果我在子图中添加 responseCachePlugin,它(或多或少)正常工作
但是,当我尝试在网关(即联合服务)使用 responseCachePlugin 时,它会被忽略:所有请求总是命中下游子图
包.json
"dependencies": {
...
"@nestjs/common": "^7.6.18",
"@nestjs/core": "^7.6.18",
"@nestjs/graphql": "^7.11.0",
"@nestjs/platform-express": "^7.6.18",
"apollo-server-express": "^2.25.0",
"apollo-server-plugin-response-cache": "^0.9.0",
...
"graphql": "^15.5.0",
"graphql-subscriptions": "^1.2.1",
"graphql-type-json": "^0.3.2",
...
}
注意:使用 0.9.0 与 2.25.0 兼容(还不能移动到最新的 3.2.0)
然后,在网关的“主”模块中,我有:
GraphQLGatewayModule.forRootAsync({
imports: [
LoggerModule,
BuildServiceModule,
ConfigModule.register(GwEnvVar, GW_DEFAULT_CONFIG),
],
inject: [ConfigService, GATEWAY_BUILD_SERVICE],
useFactory: (configService: ConfigService<GwEnvVar>) => ({
cors: true,
server: {
introspection:
configService.env.NODE_ENV === NodeEnv.PRODUCTION ? false : true,
playground: true,
cacheControl: {
defaultMaxAge: 5,
},
plugins: [responseCachePlugin()],
},
gateway: getSupergraphSchema('schema.gql', configService.env),
}),
}),
],
})
export class GraalModule {}
应用程序正确启动,但正如我已经说过的,每个请求都会命中下游子图
另请注意,如果我将完全相同的配置直接放在子图中,那么解析器将不再被命中(但是,这意味着缓存是在子图中完成的,这不是我想要的)
如果不直接提供解决方案,是否有人可以解释缓存应该如何与阿波罗联邦合作(除了极简主义文档https://www.apollographql.com/docs/apollo-server/performance/caching/#caching -with-responsecacheplugin-advanced和https://www.apollographql.com/docs/federation/performance/caching/)?