質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

607閲覧

javascript ServiceWorker オフラインでmp3ファイルのキャッシュが読み込めない

kokemomo

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/06/24 02:31

実現したいこと

ServiceWorkerによるオフラインでのmp3ファイルのキャッシュの読み込みを実現したい

前提

ServiceWorkerによってキャッシュの読み込みは成功しました。
しかしオフラインの状態では、
mp3ファイルのキャッシュの読み込みがエラーになります。
mp3以外のファイルならキャッシュの読み込みは成功します。

発生している問題・エラーメッセージ

The FetchEvent for "<URL>" resulted in a network error response: the promise was rejected. ---------------------------------------------- Uncaught (in promise) TypeError: Failed to fetch at service-worker.js:33 (匿名) @ service-worker.js:33 ---------------------------------------------- GET https://xxxxxxxx.com/sound/xxxxxxxx.mp3 net::ERR_FAILED ---------------------------------------------- Uncaught (in promise) DOMException: Failed to load because no supported source was found.

該当のソースコード

javascript

1 2self.addEventListener('fetch', (event) => { 3 4 event.respondWith( 5 caches.match(event.request) 6 .then((response) => { 7 8 if (response) { 9 return response; 10 } 11 12 let fetchRequest = event.request.clone(); 13 14 return fetch(fetchRequest) 15 .then((response) => { 16 if (!response || response.status !== 200 || response.type !== 'basic') { 17 return response; 18 } 19 20 let responseToCache = response.clone(); 21 22 caches.open(CACHE_NAME) 23 .then((cache) => { 24 cache.put(event.request, responseToCache); 25 }); 26 27 return response; 28 }); 29 }) 30 ); 31});

ソースコード

javascript

1//service-worker.js 2 3var CACHE_VERSION = 'v.1'; 4var CACHE_NAME = 'XXXXXXXX'; 5var CASHE_FILES = [ 6'./index.html', 7'./css/xxxxxxxx.css', 8'./img/xxxxxxxx.svg', 9'./js/xxxxxxxx.js', 10'./sound/xxxxxxxx.mp3' 11]; 12 13self.addEventListener('install', function(e) { 14 e.waitUntil( 15 // キャッシュの登録 16 caches.open(CACHE_NAME) 17 .then(function(cache) { 18 return cache.addAll(CASHE_FILES); 19 }) 20 ); 21}); 22 23self.addEventListener('fetch', (event) => { 24 25 event.respondWith( 26 caches.match(event.request) 27 .then((response) => { 28 29 if (response) { 30 return response; 31 } 32 33 let fetchRequest = event.request.clone(); 34 35 return fetch(fetchRequest) 36 .then((response) => { 37 if (!response || response.status !== 200 || response.type !== 'basic') { 38 return response; 39 } 40 41 let responseToCache = response.clone(); 42 43 caches.open(CACHE_NAME) 44 .then((cache) => { 45 cache.put(event.request, responseToCache); 46 }); 47 48 return response; 49 }); 50 }) 51 ); 52});

試したこと

CASHE_FILES に以下を付加しました。
結果はキャッシュの読み込みがエラーになりました。

jjavascript

1.map(path => new URL(path, registration.scope).pathname);

補足情報(FW/ツールのバージョンなど)

ServiceWorkerの動作確認は以下です。

chrome
バージョン: 114.0.5735.134

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

この回答はGPT-4による自動生成回答です

オフラインでのmp3ファイルのキャッシュ読み込みに問題がある場合、以下の変更を試してみてください。

  1. response.type !== 'basic' の条件を削除するか、mp3ファイルの場合はこの条件を無視するように変更してください。これにより、mp3ファイルのキャッシュが正しく保存されるようになります。

javascript

1self.addEventListener('fetch', (event) => { 2 event.respondWith( 3 caches.match(event.request) 4 .then((response) => { 5 if (response) { 6 return response; 7 } 8 9 let fetchRequest = event.request.clone(); 10 11 return fetch(fetchRequest) 12 .then((response) => { 13 if (!response || response.status !== 200) { 14 return response; 15 } 16 17 let responseToCache = response.clone(); 18 19 caches.open(CACHE_NAME) 20 .then((cache) => { 21 cache.put(event.request, responseToCache); 22 }); 23 24 return response; 25 }); 26 }) 27 ); 28});
  1. キャッシュされたmp3ファイルを使用する際、audio タグの src 属性に URL.createObjectURL() を使用して、Blob URLを設定してみてください。これにより、オフライン状態でもmp3ファイルが正しく再生されるようになります。

javascript

1fetch('https://xxxxxxxx.com/sound/xxxxxxxx.mp3') 2 .then(response => response.blob()) 3 .then(blob => { 4 const audio = document.createElement('audio'); 5 audio.src = URL.createObjectURL(blob); 6 document.body.appendChild(audio); 7 });

これらの変更を試して、オフライン状態でのmp3ファイルのキャッシュ読み込みが正常に動作するか確認してください。

投稿2023/06/24 02:32

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokemomo

2023/06/24 08:28

ご回答ありがとうございます。 URL.createObjectURL() を使用して、Blob URLを設定したところ 新たにエラーが発生しました。 再度質問させて頂きます。宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問