Service Worker 中的获取 API 错误
Fetch API Error in Service Worker
我正在尝试缓存来自 LastFM API 的图像。现在,API 响应本身已被很好地缓存并且页面按预期加载,但是没有图像。
查看开发人员控制台,我可以看到一些关于图像检索的错误,如下所示:
Fetch API cannot load http://img2-ak.lst.fm/i/u/300x300/a32cb06bb22bc5d10654a5156fe78cf6.png. The parent document page has been unloaded.
我对服务人员还很陌生,这让我焦头烂额(不,不是字面上的意思)。
我已经学习了几个教程,这是我目前得到的代码(不相关的代码已被删除)。
var CACHE_NAME = 'WELFORDIAN-CACHE-V2';
var urlsToCache = [
'https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=**USERNAME**&api_key=6136000ba0899c52db5ebcee77d4be15&format=json'
];
self.addEventListener('install', function(event) {
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
var reqURL = new URL(event.request.url);
if (/lst.fm/.test(reqURL)) {
event.respondWith(lastFMImageResponse(event.request));
} else {
event.respondWith(
caches.match(event.request).then(function(response) {
if (response) {
return response;
}
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
);
}).catch(function(err) {
return err;
})
);
}
});
function lastFMImageResponse(request) {
return caches.match(request).then(function(response) {
if (response) {
return response;
}
return fetch(request).then(function(response) {
caches.open('lfm-images').then(function(cache) {
cache.put(request, response);
});
return response.clone();
});
});
}
我显然做错了什么,但是比我更有经验的人能解释一下吗?
问题是您的网站是 HTTPS,而图像是通过 HTTP 提供的。
混合内容目前不能很好地与服务工作者一起工作:https://github.com/w3c/webappsec/issues/415。
我正在尝试缓存来自 LastFM API 的图像。现在,API 响应本身已被很好地缓存并且页面按预期加载,但是没有图像。
查看开发人员控制台,我可以看到一些关于图像检索的错误,如下所示:
Fetch API cannot load http://img2-ak.lst.fm/i/u/300x300/a32cb06bb22bc5d10654a5156fe78cf6.png. The parent document page has been unloaded.
我对服务人员还很陌生,这让我焦头烂额(不,不是字面上的意思)。
我已经学习了几个教程,这是我目前得到的代码(不相关的代码已被删除)。
var CACHE_NAME = 'WELFORDIAN-CACHE-V2';
var urlsToCache = [
'https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=**USERNAME**&api_key=6136000ba0899c52db5ebcee77d4be15&format=json'
];
self.addEventListener('install', function(event) {
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
var reqURL = new URL(event.request.url);
if (/lst.fm/.test(reqURL)) {
event.respondWith(lastFMImageResponse(event.request));
} else {
event.respondWith(
caches.match(event.request).then(function(response) {
if (response) {
return response;
}
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
);
}).catch(function(err) {
return err;
})
);
}
});
function lastFMImageResponse(request) {
return caches.match(request).then(function(response) {
if (response) {
return response;
}
return fetch(request).then(function(response) {
caches.open('lfm-images').then(function(cache) {
cache.put(request, response);
});
return response.clone();
});
});
}
我显然做错了什么,但是比我更有经验的人能解释一下吗?
问题是您的网站是 HTTPS,而图像是通过 HTTP 提供的。
混合内容目前不能很好地与服务工作者一起工作:https://github.com/w3c/webappsec/issues/415。