0

尝试将对象保存到存储时,我收到 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);    
  }   
});
4

2 回答 2

1

谢谢@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上的回答进一步分解

于 2021-05-16T04:58:24.267 回答
1

好吧,您获得QUOTA_BYTES_PER_ITEM的唯一合乎逻辑的原因是您正在尝试使用超过 8k 标记的字符串...

但是,我觉得这里有两件事可能会出错..

  1. 仔细检查键:值
  2. “可变字节长度”由于您正在对字符串进行编码,因此您的字符串可能充满了 2 字节数据 [如果字符代码大于256 或 (<= 0xFF)则字节大小为 2,您的字符串可能是 3452 但充满 2 个字节然后它会超过 8k 标记,它可能只是那个盲点。
于 2021-05-17T04:37:03.603 回答