我正在尝试使用扩展中的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时都会被删除)