如何在NodeJS中缓存来自google drive API的响应

问题描述 投票:0回答:1

我想在网页上重现谷歌驱动器中的音乐文件。我有每个文件的链接,但调用的响应缓存头是'no-cache,no-store,max-age = 0,must-revalidate'所以它永远不会保存在浏览器缓存中。有什么办法吗?添加缓存到谷歌驱动器文件请求?

问题:

当您使用音乐文件(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没有运气。我尝试使用重定向网址,但我收到“状态代码:302 Found”

一种解决方案可能是下载文件并直接从我的服务器提供,但我将忽略使用驱动器存储的重点。我真的想使用谷歌驱动器存储,而不是重复我的服务器上的所有文件。

有没有推荐的方法来为这种情况进行缓存?也许有一些我缺少的谷歌驱动器配置。或者你知道在这种情况下我可以采取的另一种方法吗?

node.js caching google-drive-sdk google-api-nodejs-client workbox
1个回答
0
投票

您应该能够使用Workbox(以及一般的Cache Storage API)缓存重定向的响应。 HTTP 30x重定向自动跟随by default,您只需要路由原始的非重定向URL。

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

相关的代码片段,也说明了在提供文件时没有使用CORS的事实(因此你将获得状态为opaque response0):

workbox.routing.registerRoute(
  new RegExp('https://drive.google.com/'),
  new workbox.strategies.CacheFirst({
    plugins: [
      new workbox.cacheableResponse.Plugin({statuses: [0, 200]})
    ],
  })
);
© www.soinside.com 2019 - 2024. All rights reserved.