way*_*mor 6 cache-control code-first graphql apollo-server nestjs
我正在尝试在某些字段上设置静态cacheControl,如此处所示
根据我的理解,我需要使用指令,因此我使用以下嵌套文档来声明指令
因此,我构建了一个 cacheControl 指令,这就是我的 GraphQLModule.forRootAsync 在 buildSchemaOptions 中的内容:
buildSchemaOptions: {
directives: [
new GraphQLDirective({
name: 'cacheControl',
locations: [
DirectiveLocation.FIELD_DEFINITION,
DirectiveLocation.OBJECT,
DirectiveLocation.INTERFACE,
DirectiveLocation.UNION
],
args: {
maxAge: { type: GraphQLInt },
scope: {
type: new GraphQLEnumType({
name: 'CacheControlScope',
values: {
PUBLIC: {
astNode: {
kind: 'EnumValueDefinition',
description: undefined,
name: {
kind: 'Name',
value: 'PUBLIC'
},
directives: []
}
},
PRIVATE: {
astNode: {
kind: 'EnumValueDefinition',
description: undefined,
name: {
kind: 'Name',
value: 'PRIVATE'
},
directives: []
}
}
}
})
},
inheritMaxAge: { type: GraphQLBoolean }
}
})
]
}
Run Code Online (Sandbox Code Playgroud)
它确实在模式中创建了指令:
directive @cacheControl(maxAge: Int, scope: CacheControlScope, inheritMaxAge: Boolean) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION
enum CacheControlScope {
PUBLIC
PRIVATE
}
Run Code Online (Sandbox Code Playgroud)
现在,我尝试在 @ObjectType 中的字段声明中使用它,如下所示:
import { Directive, Field, Int, ObjectType } from '@nestjs/graphql'
@ObjectType('User')
export class User {
@Directive('@cacheControl(maxAge:60)')
@Field(() => Int)
id!: number
@Directive('@cacheControl(maxAge:60)')
@Field()
text!: string
}
Run Code Online (Sandbox Code Playgroud)
但是,当执行一些查询来获取所有用户时,它似乎没有缓存任何内容 - 并且不会发送缓存控制标头,并且每次都会执行整个查询。我尝试做一个转换器,但不确定如何为解析器实现缓存。我缺少什么?
归档时间: |
|
查看次数: |
943 次 |
最近记录: |