如何在apollo-server-hapi graphql上实现缓存

时间:2018-10-22 03:35:46

标签: caching graphql hapijs apollo-server

我有带有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".

您能帮忙,在架构上应用缓存控制的正确方法是什么?

我按照下面的指示进行操作,但是似乎没有用。

apollo-cache-control

3 个答案:

答案 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,主要问题来自使用makeExecutableSchemadocs提到这是由于模式缝合引起的。

不幸的是,如果您使用类似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

祝你好运!