2017-10-18 9 views
3

J'utilise le stockage de chrome dans mon application qui fonctionnait bien. Le processus est très simple. L'utilisateur saisit l'adresse e-mail et le mot de passe, l'application les vérifie en utilisant la requête XHR et maintient la session en utilisant chrome.storage.local.set. Une fois la session définie, je recharge l'application en utilisant chrome.runtime.reload(). Sur chaque rechargement, j'utilise la fonction checkLogin pour vérifier si la session est active ou non. Ça fonctionnait bien. Mais maintenant je reçois cette erreur:chrome.storage.local.get vide après chrome.runtime.reload() - application empaquetée

enter image description here

Il semble que le stockage se vide après avoir rechargé l'application et l'application ne peut pas trouver le mot-clé dans le stockage et le retour d'erreur non définie.

Voici le code qui est appelé une fois que l'utilisateur est authentifié:

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 
} 

Une fois que l'application est rechargé je vérifie la session enregistrée:

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; 
}) 
} 

À ce stade, je reçois l'erreur J'ai joint à la capture d'écran ci-dessus. J'ai également utilisé console.log(chrome.storage); pour vérifier l'état du stockage et il est retourné indéfini. La chose étrange est une fois que je relance l'application manuellement la partie .get du code fonctionne très bien. Au début, il montre l'erreur que j'ai dû recharger la page afin d'obtenir la valeur de stockage stockée.

Manifest:

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

MISE À JOUR:

La question n'est pas le chrome.storage comme mentionné dans le titre de poste. Le problème principal avec chrome.runtime.reload(). Après le lancement de l'application initiale, chaque fois que j'appelle chrome.runtime.reload() dès que l'application recharge tout ce qui commence à chrome. ne fonctionne pas.

+0

Est-ce une application ou une extension? Ce devrait être seulement un. S'il vous plaît [modifier] votre question pour inclure uniquement la balise appropriée. – Makyen

+0

S'il vous plaît [modifier] la question à être sur le sujet: inclure un [mcve] qui * duplique le problème *. Pour les extensions Chrome ou Firefox WebExtensions, vous devez presque toujours inclure votre * manifest.json * et une partie de l'arrière-plan, du contenu et/ou des scripts contextuels/HTML, et souvent des HTML/scripts de pages Web. Les questions demandant l'aide au débogage ("pourquoi mon code ne fonctionne-t-il pas comme je veux?") Doivent inclure: (1) le comportement souhaité, (2) un problème ou une erreur spécifique et (3) le code le plus court nécessaire pour le reproduire * dans la question elle-même *. S'il vous plaît voir aussi: [Quels sujets puis-je poser ici?] (/ Help/on-topic), et [ask]. – Makyen

+0

Veuillez ajouter du code, des erreurs et des données en tant que ** text ** ([en utilisant le formatage de code] (// stackoverflow.com/editing-help#code)), pas d'images. Images: A) ne nous permettent pas de copier et coller le code/les erreurs/les données pour les tests; B) ne permettent pas la recherche en fonction du contenu du code/de l'erreur/des données; et [beaucoup d'autres raisons] (https://meta.stackoverflow.com/a/285557). En général, code/erreurs/données au format texte >>>> code/erreurs/données sous forme d'image >> rien. Les images ne doivent être utilisées *, en plus du texte au format de code *, que si l'image contient quelque chose d'important qui n'est pas véhiculé uniquement par le code texte/l'erreur/les données. – Makyen

Répondre

2

Je n'ai pas trouvé de solution, mais j'ai trouvé une solution de contournement. Mon hypothèse initiale était qu'après le rechargement de l'application chrome.storage ne fonctionne pas parce que c'est la première chose que mon application vérifie. Après un peu plus de débogage j'ai découvert que chaque fois que j'appelle chrome.runtime.reload() dès que l'application recharge n'importe quoi à partir de chrome. ne fonctionne pas. Le problème est avec le rechargement de l'application Pour tester cela, j'ai tout supprimé de l'application juste un message de journal montrant les détails manifestes console.log(chrome.runtime.getManifest()) et un bouton "Recharger" sur l'événement de clic, il appelle chrome.runtime.reload(). Au lancement initial de l'application, tout fonctionne correctement avec un message du journal de la console affichant les détails du manifeste. Lorsque je clique sur le bouton Recharger et l'application rechargements il montre:

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

J'ai essayé d'utiliser d'autres fonctions comme chrome.storage.local.set/get avec la même erreur non définie. Pour résoudre ce problème, la solution consiste à créer une nouvelle fenêtre au lieu de recharger l'application et fermer la précédente.

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

Si quelqu'un ayant le même problème et trouvé une solution de rechange meilleure/plus propre pour cela, s'il vous plaît partager.

+0

J'ai un problème similaire, de temps en temps, mon application Chrome fonctionne trop rapidement au démarrage et chrome.runtime.getManifest ou chrome.runtime.getPlatformInfo n'est pas défini pour le moment, je pense que je dois utiliser votre solution de la même manière. J'ai tracé le code chromé, trouvé que: – Imskull

+0

"apiFunctions.setHandleRequest ('getManifest', function() { renvoient runtimeNatives.GetManifest(); });" bug de chrome provoqué par un code asynchrone? Cependant, je n'en ai aucune idée. – Imskull