0

我想用 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-advancedhttps://www.apollographql.com/docs/federation/performance/caching/)?

4

0 回答 0