带有 cacheControl 指令的 Apollo Graphql 导入问题
Posted
技术标签:
【中文标题】带有 cacheControl 指令的 Apollo Graphql 导入问题【英文标题】:Apollo Graphql Import Issue with cacheControl directive 【发布时间】:2019-07-31 07:15:07 【问题描述】:我正在使用"graphql-import": "^0.7.1"
我尝试将 @cacheControl
指令添加到我的 graphql 架构中
type Post @cacheControl(maxAge: 240)
id: Int!
title: String
author: Author
votes: Int @cacheControl(maxAge: 30)
readByCurrentUser: Boolean! @cacheControl(scope: PRIVATE)
然后它给出了这个错误 -
Error: Directive cacheControl: Couldn't find type cacheControl in any of the schemas.
所以在从链接中获取提示之后 -
https://github.com/prisma/graphql-import/issues/153
我在下面添加了代码
directive @cacheControl(
maxAge: Int,
scope: CacheControlScope
) on OBJECT | FIELD_DEFINITION
enum CacheControlScope
PUBLIC
PRIVATE
但在那之后我开始收到这个错误 -
Error: There can be only one type named "CacheControlScope".
Enum value "CacheControlScope.PUBLIC" can only be defined once.
Enum value "CacheControlScope.PRIVATE" can only be defined once.
我不知道如何解决这个问题。
【问题讨论】:
你能不能尝试把cacheDirective放在一个directives.graphql上然后导入它(#import cacheControl from 'directives.graphql')看看它是否有效? @jgoday 我也试过了,但还是不行 【参考方案1】:你在哪里声明这些枚举和指令? 我不断收到这些错误,只是因为我将它们放入了不止一次引用的 typedef 文件中。 然后我刚刚将此代码移动到我的主架构文件中
const CacheControl = gql`
enum CacheControlScope
PUBLIC
PRIVATE
directive @cacheControl (
maxAge: Int
scope: CacheControlScope
) on FIELD_DEFINITION | OBJECT | INTERFACE
`
...
const typeDefs = [
CacheControl,
...
]
const server = new ApolloServer(
typeDefs,
...
)
问题就解决了。
【讨论】:
【参考方案2】:静态提示给了我同样的错误,所以我尝试在解析器中使用动态提示,它可以工作。
关于Apollo Docs:
const resolvers =
Query:
post: (_, id , _, info) =>
info.cacheControl.setCacheHint( maxAge: 60, scope: 'PRIVATE' );
return find(posts, id );
【讨论】:
【参考方案3】:也遇到了这个问题,找不到指令是由于模式拼接造成的。我通过将指令和枚举定义放在架构本身中来使用与您相同的工作。当我遇到该错误时,我必须至少升级到 2.6.6,因为他们在那里为您收到的欺骗错误添加了修复 ref:https://github.com/apollographql/apollo-server/pull/2762
【讨论】:
以上是关于带有 cacheControl 指令的 Apollo Graphql 导入问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 5.0 存储门面将元数据、标头(Expires、CacheControl)添加到上传到 Amazon S3 的文件中
带有 Vertx 订阅的 Apollo GraphQL 失败