Как проверить, существует ли ключ хранилища в 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: Ошибка в getErrorWithStack (http://localhost:3000/static/js/0.chunk.js:14551:10) в новом Dex…, имя: ConstraintError, сообщение: Ключ уже существует в хранилище объектов.↵ ConstraintError: ключ уже существует в хранилище объектов., внутренний: DOMException: ключ уже существует в хранилище объектов., _promise: DexiePromise,

чтобы проверить, существует ли ключ, я могу думать только об использовании error.message.

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

Есть ли лучший способ проверить, существует ли уже ключ хранилища, чтобы я мог обновить его, а не перезаписывать.


person e.iluf    schedule 13.03.2021    source источник


Ответы (1)


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);
}

Но, как видите, в этом примере это особо ничего не упрощает.

person David Fahlander    schedule 13.03.2021