Как кэшировать ответ от API Google Drive в NodeJS - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу воспроизводить музыкальные файлы с Google Drive на веб-странице. У меня есть ссылка для каждого файла, но заголовки кэша ответов для вызовов: «без кэша, без хранения, max-age = 0, must-revalidate», поэтому он никогда не будет сохранен в кэше браузера. Есть ли способ добавить кеш к файлам запросов google drive?

Проблема:

При использовании ссылки на диск для музыкального файла (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 Drive Storage и не дублировать все файлы на моем сервере.

Есть ли рекомендуемый способ кэширования для этого случая? возможно есть какая-то конфигурация диска google, которую я пропускаю. Или вы знаете другой подход, который я мог бы использовать в этом случае?

1 Ответ

0 голосов
/ 01 мая 2019

Вы должны иметь возможность кэшировать перенаправленные ответы, используя Workbox (и API Cache Storage в целом). HTTP 30x перенаправления выполняются автоматически по умолчанию , и вам нужно только направить исходный, не перенаправленный URL.

Вот живой пример проекта Glitch, который использует Workbox для кэширования этого файла MP3: https://glitch.com/edit/#!/horn-sausage?path=sw.js:9:0

Соответствующий фрагмент кода, который также учитывает тот факт, что при обслуживании файлов не используется CORS (поэтому вы получите непрозрачный ответ со статусом 0), :

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