我正在处理大型Angular应用程序,并且如果他们禁用了Cookie,则需要向用户显示错误消息。
因此出现问题:当使用以下错误消息禁用cookie时,尝试加载试图访问本地存储的模块时Angular崩溃:
Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
Angular在这里抛出错误:
function getService(serviceName, caller) {
if (cache.hasOwnProperty(serviceName)) {
if (cache[serviceName] === INSTANTIATING) {
throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
serviceName + ' <- ' + path.join(' <- '));
}
return cache[serviceName];
} else {
try {
path.unshift(serviceName);
cache[serviceName] = INSTANTIATING;
return cache[serviceName] = factory(serviceName, caller);
} catch (err) {
if (cache[serviceName] === INSTANTIATING) {
delete cache[serviceName];
}
throw err; // THIS IS WHATS BEING THROWN
} finally {
path.shift();
}
}
}
此应用程序的许多组件以某种方式访问localStorage,只是简单地将它们硬重定向到另一个页面以显示此错误似乎不够优雅。
还有其他人遇到过这个问题吗?
答案 0 :(得分:0)
我之前遇到过类似的事情。遗憾的是,检查localStorage是否存在的唯一方法是尝试访问它,如果不存在则抛出异常。因此,您可以在localStorage上调用的任何地方添加异常处理。
OR
我不知道你有多少地方直接访问localStorage,但是创建一个服务来检查你需要的所有客户端功能可能会有所帮助。 所以你可以使用像这样的函数
function lsTest(){
var test = 'test';
try {
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch(e) {
return false;
}
}
if(lsTest() === true){
// available
}else{
// unavailable
}
取自 check if localStorage is available
将此信息添加到由直接访问localStorage的所有服务/控制器访问的服务中,并跳过对localStorage的任何调用。这可以防止您在初始化时遇到的异常。