Почему storage.set/storage.get не может установить/получить данные в Chrome?

Я начинаю учиться отлаживать расширение в Chrome. У меня есть эта проблема в Chrome, но в веб-расширениях Firefox проблем нет. Проблема в том, что в Chrome я не могу получить данные, которые были сохранены в хранилище.

У меня есть эта функция в фоновом скрипте. Я добавляю точку останова в строку с storage.set . Я перезапускаю аддон, и я могу получить доступ ко всем данным в MyNamespace.data... Аддон печатает уведомление о том, что установка прошла успешно, но журнал показывает пустой объект, когда я пытаюсь получить данные.

MyNamespace.checkIfExists = function (item) {
  if (chrome.runtime.lastError) {
    MyNamespace.notify("check-fail");
    console.log("error:" + chrome.runtime.lastError);
    console.log(chrome.runtime.lastError);
  } else {
    if ( ! ( "initiated" in item ) )
      {
      console.log("I'm initiating .. item:");
      console.log(item);
      /* Insert new data object */
      /* This saves default values into storage */       
      chrome.storage.local.set({
        easy:     MyNamespace.data.easy,
        advanced: MyNamespace.data.advanced,
        images:   MyNamespace.data.images,
        inspector:MyNamespace.data.inspector,
        extractor:MyNamespace.data.extractor,
        profiles: MyNamespace.data.profiles,
        default_profiles: MyNamespace.data.default_profiles        
        }, 
        () => {
          if (chrome.runtime.lastError) 
            { 
            MyNamespace.notify("write-fail");            
            console.log("local.set Error: " + chrome.runtime.lastError); }
          else
            {                         
            MyNamespace.notify("write-succeess");
            chrome.storage.local.get( {initiated: undefined, easy:undefined}, 
              (result) => {
                if (typeof result === undefined )
                  MyNamespace.notify("write-fail");
                console.log("found:");
                console.log(result);
                console.log("/end");
                }
              )
            chrome.storage.local.set( {initiated:true} );            
            MyNamespace.initiated = true;
            }
        } );
      }
    else
      MyNamespace.initiated = true;
  }
};

Результат в консоли:

I'm initiating .. item:
namespace.js:125 Object {}
namespace.js:149 found:
namespace.js:150 Object {}
namespace.js:151 /end

Нет ошибки в консоли. В Chrome объект пуст. В Firefox я вижу, что один объект должен быть сохранен, одно свойство не определено.

manifest.json

{
  "applications": {
  "gecko": {
    "id": "[email protected]",
    "strict_min_version": "48.0a1"
    }
  },
"description": "An example options ui",
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/favourite-colour",
"manifest_version": 2,
"name": "Favourite colour",
"version": "1.0",
"icons": {  
  "48": "icons/eye-icon-colored-48.png"    
},
"options_ui": {
  "page": "options.html",
  "open_in_tab": true
  },
"browser_action": {
  "default_title": "Adapt page",
  "browser_style": true,
  "default_popup": "popup/settings.html",
  "default_icon": {
    "48": "icons/eye-icon-48.png"
  }
},
"web_accessible_resources": [
  "icons/hotkeys-icon-32.png"
  ],
"permissions": ["storage", "tabs", "activeTab", "notifications"],
"background": {
  "page": "background_scripts/background_scripts_bug_fix.html"
 },
"content_scripts": [
    {
    "matches": ["<all_urls>" ],
    "run_at": "document_start",
    "js": [
      "content_scripts/jquery-3.0.0.js",
      "content_scripts/namespace.js",
      "content_scripts/easy.js",
      "content_scripts/addListeners.js"
      ]
    }
  ],
"commands": {
  "easy": {
    "suggested_key": {
      "default": "Ctrl+Shift+U"    
    },
    "description": ""
  }
 }
}

Я добавил этот прослушиватель, который будет запускаться при сохранении данных хранилища:

chrome.storage.onChanged.addListener(function(changes, namespace) {
  for (key in changes) {
    var storageChange = changes[key];
    console.log('Storage key "%s" in namespace "%s" changed. ' +
                'Old value was "%s", new value is "%s".',
                key,
                namespace,
                storageChange.oldValue,
                storageChange.newValue);
  }
});

И я получил этот журнал:

    namespace.js:241 Storage key "default_profiles" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:241 Storage key "easy" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:241 Storage key "extractor" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:241 Storage key "images" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:241 Storage key "initiated" in namespace "local" changed. Old value was "true", new value is "undefined".
    namespace.js:241 Storage key "inspector" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:241 Storage key "profiles" in namespace "local" changed. Old value was "Object", new value is "undefined".
    namespace.js:124 I'm initiating .. item:
    namespace.js:125 Object {}
    namespace.js:241 Storage key "advanced" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "default_profiles" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "easy" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "extractor" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "images" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "inspector" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:241 Storage key "profiles" in namespace "local" changed. Old value was "undefined", new value is "Object".
    namespace.js:152 found:
    namespace.js:153 Object {}
namespace.js:154 /end
namespace.js:241 Storage key "initiated" in namespace "local" changed. Old value was "undefined", new value is "true".

Итак, что это значит? Я вижу слово Object() в Chrome, белые буквы (темная тема), но это не похоже на ссылку, по которой я мог бы щелкнуть и увидеть объект. Это показывает, что данные загружены. Но почему я не могу смотреть данные в Объекте?

  1. Я не могу войти в обратный вызов, поэтому я не могу просмотреть данные
  2. Я не могу посмотреть, что находится в Object {} в консоли .... похоже, что он пуст, но в прослушивателе я получил хранилище сообщений, которое было изменено.
  3. результат в результате обратного вызова storage.get пуст... не содержит свойств

Я проверил это с помощью этого кода: for (var key in result) if (hasOwnProperty.call(result, key)) console.log("key:" + key);

В Chrome свойства не указаны, в Firefox Toolbox/Console они перечислены.

Насколько я понимаю, обратный вызов storage.set должен запускаться после внесения изменений сохранения и закрытия файла db для записи. Поэтому я ожидаю, что не должно быть никаких проблем с storage.get, запущенным изнутри storage.set.

Может кто-нибудь прояснить, что здесь происходит? Почему в Firefox это работает, а в Chrome нет? Как решить проблему?


person John Boe    schedule 28.08.2016    source источник


Ответы (1)


chrome.storage.local.get( {инициировано: не определено, легко: не определено},

Ничего не получит, потому что извлекаются только определенные ключи (1, 2) с использованием промежуточного стробирование объекта параметров: JSON.stringify({a:undefined,b:undefined}) выдает '{}' - пусто.

Вместо этого используйте массив имен ключей, если вы не предоставляете значения по умолчанию:

chrome.storage.local.get( ['initiated', 'easy'], 

P.S. используйте %o или %O в console.log строка формата для отображения фактического содержимого объектов.

person wOxxOm    schedule 28.08.2016
comment
Спасибо. Вы спасли меня. ИДК, почему я раньше не пробовал. Я потратил неделю, пытаясь решить эту проблему. - person John Boe; 28.08.2016