Простое хранилище без сохранения данных между сессиями
Я пытаюсь использовать 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