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 标记的字符串...

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...