如何解决Chrome API:运行时 QUOTA_BYTES_PER_ITEM 配额超出错误,但预检通过
我在尝试将对象保存到存储时收到超出 QUOTA_BYTES_PER_ITEM 配额的错误,但我对大小的预检查通过了。我确定我在这里犯了某种基本错误(这是检查对象大小的有效方法吗?)。我已经用LZString压缩了我想保存的项目,但无论如何,它似乎比配额小得多。
var objToSave = {};
objToSave[myKey] = compressedObj;
console.log("Size of obj is: " + JSON.stringify(objToSave).length); //prints 3452
console.log(chrome.storage.sync.QUOTA_BYTES_PER_ITEM); //prints 8192
if (JSON.stringify(objToSave).length >= (chrome.storage.sync.QUOTA_BYTES_PER_ITEM)) { // this never triggers
alert('objToSave is too large!');
return;
}
chrome.storage.sync.set(objToSave,function() {
if (chrome.runtime.lastError) { // this error gets triggered.
console.log("Error: " + chrome.runtime.lastError.message); // this error gets triggered.
return customAlert("Error!: " + chrome.runtime.lastError.message);
}
});
解决方法
谢谢@nishant 和@wOxxOm - 这正是错误所在。我检查的尺寸有误。
为了正确检查大小,我现在使用的是获取字节大小与字符串的长度
var s = JSON.stringify(objToSave);
encodeURI(s).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1)
这给了我 10765 的大小,我现在正在使用 @wOxxOm 在 https://stackoverflow.com/a/67429150/4797507 上的回答进一步分解{{3}}
,好吧,您获得 QUOTA_BYTES_PER_ITEM 的唯一合乎逻辑的原因是您正在尝试使用超过 8k 标记的字符串...
但是,我觉得这里有两件事可能会出错..
- 仔细检查 key:value 对
- “可变字节长度” 由于您正在对字符串进行编码,因此您的字符串可能会充满 2 字节数据[如果字符代码大于 256 或( 那么字节大小是 2,你的字符串可能是 3452 但满 2 个字节然后它会超过 8k 标记,它可能只是那个盲点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。