【问题标题】:chrome.storage.local.get empty after chrome.runtime.reload() - packaged appchrome.storage.local.get empty after chrome.runtime.reload() - 打包的应用
【发布时间】:2017-10-18 07:28:20
【问题描述】:

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

重新加载应用后似乎存储为空,应用在存储中找不到关键字并返回未定义的错误。

这里是用户通过身份验证后调用的代码:

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); 来验证存储状态,它返回未定义。 奇怪的是,一旦我手动重新启动应用程序,代码的.get 部分就可以正常工作。起初,它显示错误,我必须重新加载页面才能获取存储的存储值。

清单:

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

更新:

问题不在于帖子标题中提到的chrome.storagechrome.runtime.reload() 的主要问题。初始应用启动后,每当我调用chrome.runtime.reload() 时,应用重新加载从chrome. 开始的任何内容都不起作用。

【问题讨论】:

  • 这是一个应用程序,还是一个扩展程序?应该只有一个。请edit您的问题仅包含适当的标签。
  • edit 成为主题的问题:包括一个minimal reproducible example 重复问题。对于 Chrome 扩展程序或 Firefox WebExtensions,您几乎总是需要包含您的 manifest.json 和一些背景、内容和/或弹出脚本/HTML,通常是网页 HTML/脚本。寻求调试帮助的问题(“为什么我的代码没有按我想要的方式工作?”)必须包括:(1)期望的行为,(2)特定的问题或错误以及(3)重现它所需的最短代码在问题本身中。另请参阅:What topics can I ask about here?How to Ask
  • 请将代码、错误和数据添加为文本 (using code formatting),而不是图像。图片:A)不允许我们复制粘贴代码/错误/数据进行测试; B) 不允许根据代码/错误/数据内容进行搜索;和many more reasons。一般来说,文本格式的代码/错误/数据>>>>作为图像的代码/错误/数据>>没有。只有在除了代码格式的文本之外,如果图像添加了仅由文本代码/错误/数据无法传达的重要内容,则应使用图像。
  • 这是一个 chrome 打包的应用程序。我已经删除了扩展标签。用清单的相关部分更新了问题。图片仅用于错误截图,其余为使用代码标签粘贴的应用代码。
  • 我已经更新了问题并添加了更多代码,希望能阐明这个过程。

标签: local-storage google-chrome-app


【解决方案1】:

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

未捕获的类型错误:chrome.runtime.getManifest() 不是函数

我尝试使用其他函数,如 chrome.storage.local.set/get,但出现相同的未定义错误。

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

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

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

【讨论】:

  • 我有类似的问题,偶尔,我的 Chrome 应用程序在启动时运行得太“快”并且 chrome.runtime.getManifest 或 chrome.runtime.getPlatformInfo 目前未定义,我想我必须使用你的解决方案同样如此。我追踪了 chrome 代码,发现:
  • "apiFunctions.setHandleRequest('getManifest', function() { return runtimeNatives.GetManifest(); });"由异步代码引起的 chrome 错误?不过,我不知道。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2010-12-23
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多