Chrome API: Runtime QUOTA_BYTES_PER_ITEM quota exceeded 错误,但预检通过

Chrome API: Runtime QUOTA_BYTES_PER_ITEM quota exceeded Error, but precheck passes

我在尝试将对象保存到存储时遇到 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 在

上的回答进一步分解

好吧,你得到 QUOTA_BYTES_PER_ITEM 的唯一合乎逻辑的原因是你试图使用超过 8k 标记的字符串...

但是我觉得这里有两件事可能出了问题..

  1. 仔细检查 key:value
  2. "可变字节长度" 由于您正在对字符串进行编码,因此您的字符串可能充满 2 字节数据的可能性很小 [如果字符代码大于256 或 (<= 0xFF) 那么字节大小是 2,你的字符串可能是 3452 但充满了 2 个字节然后它会超过 8k 标记,它可能只是那个盲点。