Сброс данных indexedDB

Работаем над расширением Chrome, которое необходимо интегрировать с IndexedDB. Пытаюсь понять, как использовать Dexie.JS. Нашел кучу образцов. Они не выглядят слишком сложными. Существует один конкретный пример, особенно интересный для изучения IndexedDB с Dexie по адресу https://github.com/dfahlander/Dexie.js/blob/master/samples/open-existing-db/dump-databases.html

Однако, когда я запускаю вышеописанную "утилиту дампа", она не видит базы данных IndexedDB, говоря мне: There are databases at the current origin.

На вкладке инструментов разработчика Application в разделе «Хранилище» я вижу свою базу данных IndexedDB.

Это какая-то проблема с разрешениями? Может ли любая вкладка/пользователь получить доступ к любой базе данных indexedDB?

На что я должен смотреть?

Спасибо


person Moshe Shmukler    schedule 03.09.2017    source источник
comment
Собственные страницы расширения имеют собственное происхождение. Скрипты содержимого используют источник веб-страницы.   -  person wOxxOm    schedule 03.09.2017


Ответы (1)


В chrome/opera есть нестандартный API webkitGetDatabaseNames(), который Dexie.js использует для получения списка имен баз данных в текущем источнике. Для других браузеров Dexie эмулирует этот API, поддерживая актуальную базу данных имен баз данных для каждого источника, поэтому:

Для браузеров Chromium Dexie.getDatabaseNames() выведет список всех баз данных в текущем источнике. , но для браузеров, отличных от Chrome, будут показаны только базы данных, созданные с помощью Dexie.

Если вам нужно сделать дамп содержимого каждой базы данных, посмотрите эту проблему, что в основном дает:

interface TableDump {
    table: string
    rows: any[]
}

function export(db: Dexie): TableDump[] {
    return db.transaction('r', db.tables, ()=>{
        return Promise.all(
            db.tables.map(table => table.toArray()
                .then(rows => ({table: table.name, rows: rows})));
    });
}

function import(data: TableDump[], db: Dexie) {
    return db.transaction('rw', db.tables, () => {
        return Promise.all(data.map (t =>
            db.table(t.table).clear()
              .then(()=>db.table(t.table).bulkAdd(t.rows)));
    });
}

Объедините функции с JSON.stringify() и JSON.parse(), чтобы полностью сериализовать данные.

const db = new Dexie('mydb');
db.version(1).stores({friends: '++id,name,age'});

(async ()=>{
    // Export
    const allData = await export (db);
    const serialized = JSON.stringify(allData);

    // Import
    const jsonToImport = '[{"table": "friends", "rows": [{id:1,name:"foo",age:33}]}]';
    const dataToImport = JSON.parse(jsonToImport);
    await import(dataToImport, db);
})();
person David Fahlander    schedule 04.09.2017
comment
Для тех, кто все еще заинтересован в этом, обратите внимание, что Chrome больше не имеет этого API. chromestatus.com/feature/5725741740195840 - person Nick Cox; 09.04.2020
comment
Теперь у Chrome другой API: indexedDB.databases(). - person wOxxOm; 20.04.2020