chrome.storage.local.get在chrome.runtime.reload()之后为空 - 打包的应用程序

问题描述:

我在我的应用程序中使用的Chrome存储工作正常。这个过程非常简单。用户输入电子邮件和密码,应用程序使用XHR请求验证它们,并使用chrome.storage.local.set来维护会话。一旦会话设置我重新加载应用程序使用chrome.runtime.reload()。在每次重新加载时,我都使用checkLogin函数来验证会话是否处于活动状态。它工作正常。但现在我得到这个错误:chrome.storage.local.get在chrome.runtime.reload()之后为空 - 打包的应用程序

enter image description here

看来,存储得到重新加载应用程序,该应用程序无法找到存储的关键字并返回未定义的错误后空。

这里,一旦用户进行身份验证时调用的代码:

postLogin = function (resultData) { 
if (resultData.authStatus == 1) { 
    chrome.storage.local.set({'userData': resultData}, function(){ 
     console.log("session saved"); 
    }); 
    chrome.runtime.reload() 
} 
else { 
    $("#result").html(resultData.authMsg); 
    $("#result").attr('style', 'display: inline-block !important'); 
} 
return false 
} 

一旦应用程序重新加载我检查保存的会话:

checkLogin = function() { 
console.log(chrome.storage); 
chrome.storage.local.get("userData",function(result) { 
    userData = result.userData; 
    if (userData && userData.authStatus == 1) { 
     console.log("--- user signed In ---") 
     return true; 
    } 
    console.log(" ---- unable to find user session ----") 
    $("#auth-dialog").attr('style', 'display: inline !important'); 
    return false; 
}) 
} 

在这一点上,我发现了错误我附上上面的截图。我还使用console.log(chrome.storage);来验证存储状态,并返回undefined。 奇怪的是我一旦手动重新启动应用程序.get部分代码工作正常。起初,它显示错误,我不得不重新加载页面,以获得存储的存储值。

清单:

{ 
    ... 
    "permissions": [ "unlimitedStorage", "clipboardRead", "clipboardWrite", "nativeMessaging" , "storage" ], 
} 

UPDATE:

如在后标题中提到的问题是不是与chrome.storage。主要问题与chrome.runtime.reload()。在首次推出应用程序后,只要应用程序重新加载任何从chrome.开始的任何内容都不起作用,每当我拨打chrome.runtime.reload()即可。

+0

这是一个应用程序,或扩展?它应该只有一个。请[编辑]你的问题,只包括适当的标签。 – Makyen

+0

请[编辑]题目:包括一个[mcve] *重复问题*。对于Chrome扩展程序或Firefox Web扩展程序,几乎总是需要包含* manifest.json *和一些背景,内容和/或弹出脚本/ HTML以及常用的网页HTML /脚本。寻求调试帮助的问题(“为什么我的代码不按我想要的方式工作?”)必须包括:(1)期望的行为,(2)特定问题或错误,以及(3)重现它所需的最短代码*在问题本身*。请参阅:[我可以在这里询问什么主题?](/ help/on-topic)和[问]。 – Makyen

+0

请将代码,错误和数据添加为** text **([使用代码格式化](// *.com/editing-help#code)),而不是图像。图片:A)不允许我们复制 - 粘贴代码/错误/数据进行测试; B)不允许基于代码/错误/数据内容进行搜索;和[更多原因](https://meta.*.com/a/285557)。一般来说,代码/错误/文本格式的数据>>>>代码/错误/数据作为图像>>什么也没有。除了文本代码格式以外,还应该只使用图像*,如果图像增加了一些重要内容而不仅仅是文本代码/错误/数据。 – Makyen

我还没有找到解决方案,但我找到了解决方法。我原来的假设是,重新加载应用程序chrome.storage不起作用,因为这是我的应用程序检查的第一件事。经过一些更多的调试后,我发现只要应用程序重新加载任何从chrome.开始的任何东西都不起作用,我就会打电话给chrome.runtime.reload()。问题是重新加载应用程序为了测试这个我已经从应用程序中删除了所有的东西只是一个日志消息显示清单细节console.log(chrome.runtime.getManifest())和一个按钮“重新加载”点击事件它调用chrome.runtime.reload()。在最初的应用程序启动时,一切正常,显示清单详细信息的控制台日志消息。当我点击刷新按钮,该应用程序重新加载它显示:

Uncaught TypeError: chrome.runtime.getManifest() is not a function

我尝试使用像chrome.storage.local.set/get用相同的未定义错误等功能。

要解决此问题,解决方法是创建一个新窗口,而不是重新加载应用程序并关闭前一个窗口。

chrome.app.window.create(
    'main.html', 
    opt); 
setTimeout(function() { 
    //close previous window 
}, 300); 

如果任何人有同样的问题,并找到一个更好的/清洁的解决方法,请分享。

+0

我有类似的问题,偶尔我的Chrome应用程序在启动时运行速度太快,而chrome.runtime.getManifest或chrome.runtime.getPlatformInfo目前未定义,我想我必须同样使用您的解决方案。我追踪了chrome代码,发现: – Imskull

+0

“apiFunctions.setHandleRequest('getManifest',function(){ return runtimeNatives.GetManifest(); });” 铬异常引起的异步代码?虽然,我不知道。 – Imskull