Простое хранилище без сохранения данных между сессиями

Я пытаюсь использовать Simplestorage из моего расширения, но не могу получить значения между сеансами браузера. Вот в чем дело: из моего основного кода я создал значение следующим образом:

var ss = require("sdk/simple-storage");
ss.storage.foo = [{id:"bar1", properties:{a:"aaa", b:"bbb"}}]
console.log(ss.storage.foo);

Это нормально, я могу видеть объект через журнал. Но затем я закрыл браузер, прокомментировал "определение foo" (строка 2), и журнал консоли был "undefined".

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

cfx -b firefox run --profiledir=$HOME/.mozilla/firefox/nightly.ext-dev

Так что я уверен, что я использую один и тот же профиль каждый раз.

Что может происходить? Что мне не хватает? Любая идея приветствуется! Заранее спасибо!

Благодаря ответу Notidart я смог обнаружить, что проблема в том, что файл был сохранен при правильном закрытии Firefox. Когда вы просто убиваете его через консоль, данные не сохраняются.

3 ответа

Решение

Вот как работает простое хранилище. Это создает папку в вашем ProfD папка, которая является каталогом вашего профиля: https://github.com/mozilla/addon-sdk/blob/master/lib/sdk/simple-storage.js#L188

let storeFile = Cc["@mozilla.org/file/directory_service;1"].
                getService(Ci.nsIProperties).
                get("ProfD", Ci.nsIFile);
storeFile.append(JETPACK_DIR_BASENAME);
storeFile.append(jpSelf.id);
storeFile.append("simple-storage");
file.mkpath(storeFile.path);
storeFile.append("store.json");
return storeFile.path;

Точное местоположение созданного файла находится в папке вашего профиля, в папке с именем jetpack, затем вашим идентификатором дополнения, затем в папке с именем simple-storage, а затем в файле в этой папке с именем store.json. Пример пути:

ProfD/jetpack/addon-id/simple-storage/store.json

Затем он записывает данные в этот файл. Каждый раз, когда папка вашего профиля создается заново (из-за характера временного профиля, из-за jpm / cfx), ваши данные стираются.

Вы должны просто использовать OS.File создать свой собственный файл для сохранения данных. OS.File лучше тогда nsIFile это то, что делает простой-хранилище. Сохраните это вне этого ProfD папку, так что не забудьте удалить ее при удалении вашего аддона, в противном случае вы загрязняете компьютеры пользователей

Для будущих читателей, альтернатива рекомендации @Noitidart об использовании OS.File, это использовать API низкого уровня io/file

Вы можете создать файл, используя fileIO.open(path), Если файл не существует, он будет создан. Вы можете читать и писать, включив второй аргумент fileIO.open(path, mode),

Режим может быть:

  • r - Режим только для чтения
  • w - Режим только для записи
  • b - Бинарный режим

По умолчанию r, Вы можете использовать это для чтения и записи в файл (очевидно, что файл не может быть в ProfD папка или она будет удалена при каждом запуске jpm / cfx)

На тот случай, если кто-то еще найдет этот вопрос при использовании jpm, Обратите внимание, что --profiledir удаляется из jpmтак сделать jpm run используя тот же каталог профиля (и, следовательно, те же данные простого хранилища), вы должны запустить его с --profile опция, указывающая на путь профиля, а не имя профиля.

jpm run --profile path/to/profile
Другие вопросы по тегам