Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用GraphQL的Cloudfront缓存?_Node.js_Amazon Web Services_Amazon Cloudfront_Graphql - Fatal编程技术网

Node.js 使用GraphQL的Cloudfront缓存?

Node.js 使用GraphQL的Cloudfront缓存?,node.js,amazon-web-services,amazon-cloudfront,graphql,Node.js,Amazon Web Services,Amazon Cloudfront,Graphql,在我的公司,我们将graphql用于生产应用程序,但仅用于私人资源 目前,我们的公共API是RESTAPI,带有用于缓存的Cloudfront服务。我们希望将它们转换为GraphQL API,但问题是:如何使用GraphQL正确处理缓存 我们曾考虑使用GET-graphql端点,并在查询字符串上缓存,但我们对请求的URL的大小有点吃惊(因为我们支持IE9+,并向学校出售有时真正虚拟的代理和防火墙) 因此,我们希望使用POST-graphQL端点,但……cloudfront无法基于请求体缓存请求

在我的公司,我们将graphql用于生产应用程序,但仅用于私人资源

目前,我们的公共API是RESTAPI,带有用于缓存的Cloudfront服务。我们希望将它们转换为GraphQL API,但问题是:如何使用GraphQL正确处理缓存

我们曾考虑使用GET-graphql端点,并在查询字符串上缓存,但我们对请求的URL的大小有点吃惊(因为我们支持IE9+,并向学校出售有时真正虚拟的代理和防火墙)

因此,我们希望使用POST-graphQL端点,但……cloudfront无法基于请求体缓存请求

有人有想法/最佳实践可以分享吗?
谢谢

现在最好的两个选择是:

  • 使用专门的缓存解决方案,如
  • 在GET中使用持久化查询,其中一些查询保存在服务器上,并通过GET按名称访问

*全面披露:我在遇到这些问题后启动了FastQL,但没有找到好的解决方案。

我不确定它是否有特定的名称,但我在野外看到了一种模式,即graphQL查询本身以特定的id托管在后端。 它的灵活性要低得多,因为它需要嵌入预定义的查询

客户端只需发送参数/参数和所述预定义查询的ID以供使用,这将是您的缓存密钥。类似于HTTP缓存如何处理对
/my profile
的经过身份验证的请求,CloudFront根据头中的身份验证令牌提供不同的响应

客户端发送它的方式取决于graphQL的后端实现。 您可以将其作为白名单标题或查询字符串传递

因此,如果后端定义了一个如下所示的查询

(使用伪代码)

然后您的请求将是类似于
api.app.com/graphQL/MyQuery?eposion=3
的内容

也就是说,您是否实际测量过您的查询不适合GET请求?如果您需要CDN缓存,我会说使用GET请求,并对不符合限制的请求使用上述方法

编辑:似乎它有一个名称:自动持久化查询

另一种保留POST请求的方法是使用Lambda@Edge在CloudFront上,使用DynamoDB表存储缓存,类似于CloudFlare workers的做法

async function handleRequest(event) {
    let cache = caches.default
    let response = await cache.match(event.request)
    
    if (!response){
      response = await fetch(event.request)
      if (response.ok) {
        event.waitUntil(cache.put(event.request, response.clone()))
      }
    }
          
    return response
}
一些关于这个的阅读材料

async function handleRequest(event) {
    let cache = caches.default
    let response = await cache.match(event.request)
    
    if (!response){
      response = await fetch(event.request)
      if (response.ok) {
        event.waitUntil(cache.put(event.request, response.clone()))
      }
    }
          
    return response
}