firefox插件-不在会话之间持久化数据的简单存储



我正在尝试使用扩展中的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时,文件被保存了。当您只是通过控制台杀死它时,它并没有持久化数据。

这就是简单存储的工作原理。它会在您的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的文件夹中,然后是您的插件id,然后是名为简单存储的文件夹,然后是该文件夹中名为store.json的文件。示例路径:

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

然后它将数据写入该文件。每次重新创建配置文件文件夹时(由于临时配置文件的性质,由于jpm/cfx),您的数据都会被擦除。

您应该只使用OS.File创建自己的文件来保存数据。OS.File是比nsIFile更好的方式,这就是简单存储的作用。将其保存在ProfD文件夹之外,因此请确保在卸载插件时将其删除,否则会污染用户的计算机

如果其他人在使用jpm时发现此问题,请注意--profiledir已从jpm中删除,因此要使jpm run使用相同的配置文件目录(从而使用相同的简单存储数据),必须使用指向配置文件路径的--profile选项运行它,而不是配置文件名称。

jpm run --profile path/to/profile

对于未来的读者,@Noitidart建议使用OS.File的替代方案是使用低级别API io/file

可以使用fileIO.open(path)创建文件。如果该文件不存在,则会创建该文件。您可以通过包含第二个参数fileIO.open(path, mode)来进行读写。

模式可以是:

  • r-只读模式
  • w-只读模式
  • b-二进制模式

默认为r。您可以使用它来读取和写入文件(很明显,该文件不能在ProfD文件夹中,或者每次运行jpm/cfx时都会被删除)

相关内容

  • 没有找到相关文章

最新更新