如何在NodeJS中缓存来自Google Drive API的响应

时间:2019-04-27 04:23:46

标签: node.js caching google-drive-api google-api-nodejs-client workbox

我想在网页上从Google驱动器复制音乐文件。我有每个文件的链接,但调用的响应缓存头是“无缓存,无存储,max-age = 0,必须重新验证”,因此它永远不会保存在浏览器缓存中。有什么办法将缓存添加到Google驱动器文件请求?

问题:

当您将驱动器链接用于音乐文件(mp3)https://drive.google.com/a/pucp.pe/uc?id=1kYYS9FZ9Vxif5WJM9ZQcY4SR35NMgoIE&export=download时,GET API调用会收到302代码,该代码生成到另一个URL(在本例中为“ https://doc-0o-28-docs.googleusercontent.com/docs/securesc/bgp95l3eabkkpccn0qi0qopvc4e7d4mq/us95e8ush1v4b7vvijq1vj1d7ru4rlpo/1556330400000/01732506421897009934/01732506421897009934/1kYYS9FZ9Vxif5WJM9ZQcY4SR35NMgoIE?h=14771753379018855219&e=download”)的重定向。每个调用的标头中都有no-cache

  1. 我尝试使用工作箱(缓存API),但找不到缓存重定向的方法,可能我需要缓存两个调用(第一个GET和重定向)。但是,如果我使用重定向的URL,则可以进行缓存,但是在进行首次调用之前,我无法访问该URL。

  2. 我试图从NodeJS服务器使用代理服务器

app.get("/test", (req, res) => {
    try {
      https.get(
        URL,
        function(response) {
          res.writeHead(response.statusCode, {...response.headers, 
            "Cache-Control": "public, max-age=120",
            "Expires": new Date(Date.now() + 120000).toUTCString() })

          response.pipe(res);
        }
      );
    } catch (e) {
      console.log(e);
    }
  });

我尝试使用第一个没有运气的URL。 我尝试使用重定向URL,但收到“状态码:找到302”

一种解决方案是下载文件并直接从我的服务器提供文件,但是我将失去使用驱动器存储的意义。我真的很想使用Google驱动器存储,而不要复制服务器上的所有文件。

是否有推荐的方法来进行这种情况的缓存?也许我缺少一些Google驱动器配置。还是您知道在这种情况下可以采取的另一种方法?

1 个答案:

答案 0 :(得分:0)

您应该能够使用Workbox(通常是Cache Storage API)来缓存重定向的响应。 HTTP 30x重定向会自动by default进行跟踪,您只需路由原始的非重定向URL。

这是一个Glitch项目的实时示例,该项目使用Workbox缓存该MP3文件:https://glitch.com/edit/#!/horn-sausage?path=sw.js:9:0

相关的代码段也说明了在提供文件时不使用CORS的事实(因此您将获得状态为0的{​​{3}}):

workbox.routing.registerRoute(
  new RegExp('https://drive.google.com/'),
  new workbox.strategies.CacheFirst({
    plugins: [
      new workbox.cacheableResponse.Plugin({statuses: [0, 200]})
    ],
  })
);