我有带有apollo-server-hapi
的graphql。我尝试添加如下所示的缓存控件:
const graphqlOptions = {
schema,
tracing: true,
cacheControl: true,
};
但是当我尝试在架构基础上添加缓存选项时:
type Author @cacheControl(maxAge: 60) {
id: Int
firstName: String
lastName: String
posts: [Post]
}
我收到此错误消息:
Error: Unknown directive "cacheControl".
您能帮忙,在架构上应用缓存控制的正确方法是什么?
我按照下面的指示进行操作,但是似乎没有用。
答案 0 :(得分:0)
在了解了有关在Apollo graphql上进行缓存的更多信息之后,基本上,问题出在makeExecutableSchema
中的apollo-server-hapi
上,没有包含@cacheControl
的指令,因此为了使它起作用,我们只是需要在graphql文件中定义我们自己的@cacheControl
指令,如下所示:
enum CacheControlScope {
PUBLIC
PRIVATE
}
directive @cacheControl (
maxAge: Int
scope: CacheControlScope
) on FIELD_DEFINITION | OBJECT | INTERFACE
type Author @cacheControl(maxAge: 60) {
id: Int
firstName: String
lastName: String
posts: [Post]
}
答案 1 :(得分:0)
我也是apollo-server-lambda
,主要问题来自使用makeExecutableSchema
。 docs提到这是由于模式缝合引起的。
不幸的是,如果您使用类似graphql-middleware之类的东西,除了印度斯坦语中提到的以外,没有其他方法可以解决。还要确保您使用的是apollo服务器> 2.6.6。
答案 2 :(得分:0)
以下内容在"apollo-server-express": "^2.9.12"
中为我工作:
1.-设置全局最大缓存:
var graphqlServer = new ApolloServer({
cacheControl: {
defaultMaxAge: 1000,
},
...
2.-在架构中定义以下指令:
// Schema (root query)
const Query = gql`
directive @cacheControl(
maxAge: Int,
scope: CacheControlScope
) on OBJECT | FIELD | FIELD_DEFINITION
enum CacheControlScope {
PUBLIC
PRIVATE
}
type Query {
...
3.-最后,将其命名为:
module.exports = `
type ArticlePage @cacheControl(maxAge: 801){
article(id: String) : Article
author(key: String) : Author
}`;
诀窍是@cacheControl(maxAge: 801)
不能高于defaultMaxAge: 1000
。
祝你好运!