如何检查 IndexedDB 中是否存在存储键?

How do I check if a store key exists in IndexedDB?

我想检查并更新 indexeddb 存储中的项目数量(如果它已经存在)。这就是我目前使用 Dexie

将商品添加到商店的方式

    async function addNfetch (itemdata) {
        
        return new Promise((resolve, reject) => {
         db.table('cartitems')
        .add(itemdata)
        .then(() =>{ 
            db.table("cartitems").toArray().then((itemArry) => {
                console.log("item array ", itemArry)
    
                resolve(itemArry)
             })
        })
        .catch(error => {
            console.log(error);
          });
    
      })
    }

以上函数仅在对象键已经存在的情况下添加并抛出错误

DexieError {_e: Error at getErrorWithStack (http://localhost:3000/static/js/0.chunk.js:14551:10) at new Dex…, name: "ConstraintError", message: "Key already exists in the object store.↵ ConstraintError: Key already exists in the object store.", inner: DOMException: Key already exists in the object store., _promise: DexiePromise,

检查密钥是否存在我只能想到使用 error.message。

  if (error.message == "Key already exists in the object store"){
     // then object exist 
  }

有没有更好的方法来检查存储密钥是否已经存在,以便我可以更新而不是覆盖它。

function addNfetch (itemdata) {
  return db.table('cartitems').put(itemdata);
}

put() 与 add() 类似,但如果条目已存在则更新条目。

此外,请注意:您不需要创建新的 Promise() 来调用基于 API:s 的承诺。这个例子不需要是异步的,因为它只调用一个 API 方法。它同样可以是:

async function addNfetch (itemdata) {
  return await db.table('cartitems').put(itemdata);
}

但如您所见,在此示例中它并没有真正简化任何内容。