我尝试使用扩展程序中的简单存储,但我无法在浏览器会话之间检索值。事情就是这样:从我的主要代码中,我以这种方式创建了一个值:
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时文件被保存了。当你通过控制台杀死它时,它不会持久存储数据。
答案 0 :(得分:2)
这就是简单存储的工作原理。它会在您的个人资料目录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 ,然后是名为 simple-的文件夹存储,然后在该文件夹中名为 store.json 的文件中。示例路径:
ProfD/jetpack/addon-id/simple-storage/store.json
然后将数据写入该文件。每次重新创建配置文件夹时(由于jpm / cfx导致临时配置文件的性质),您的数据将被删除。
您应该使用OS.File
创建自己的文件来保存数据。 OS.File
比nsIFile
更好,这就是简单存储所做的。将其保存在ProfD
文件夹之外,但请确保在卸载插件时将其删除,否则会污染用户计算机
答案 1 :(得分:0)
如果其他人在使用jpm
时发现此问题,请注意--profiledir
已从jpm
中移除,因此要使用相同的个人资料目录jpm run
(和因此,相同的简单存储数据),您必须使用指向配置文件路径的--profile
选项运行它 - 而不是配置文件名称。
jpm run --profile path/to/profile
答案 2 :(得分:0)
对于未来的读者,@ Noitidart建议使用OS.File
的替代方法是使用低级API io/file
您可以使用fileIO.open(path)
创建文件。如果该文件不存在,则将创建该文件。您可以通过包含第二个参数fileIO.open(path, mode)
来读写。
模式可以是:
r
- 只读模式w
- 只写模式b
- 二进制模式默认为r
。您可以使用它来读取和写入文件(显然该文件不能在ProfD
文件夹中,或者每次运行jpm / cfx时都会被删除)