Vue.js + Dexie: импорт как модуль с настраиваемыми функциями

У меня есть рабочий Vue.js с базой данных Dexie IndexedDB, который работает плавно следующим образом: Везде, где во Vue мне нужен доступ к базе данных, я импортирую модуль:

import db from '@/services/MyIdb'

И я могу напрямую получить доступ к методам Dexie, например:

db.table(tableName).clear()

Модуль, MyIdb.js настроен следующим образом (я удалил код и таблицы для упрощения):

    import Dexie from 'dexie'

    const db = new Dexie('myDatabase')
    const idb_schema_old = { myTable: '&key', }
    const idb_schema = { myTable: '&key', }
    const db_version_old = 9
    const db_version = 10

    // NEW VERSION
    db.version(db_version_old).stores(idb_schema_old)
    db.version(db_version).stores(idb_schema)

    db.open().then(function(){
        // Success
    }).catch(Dexie.UpgradeError, function (e) {
        // Failed with UpgradeError
        console.error ("Upgrade error: " + e.message)
        console.log("Dropping database and installing latest version")
        db.delete()
        db.version(db_version).stores(idb_schema)
        db.open().catch(function (err) {
            console.error (err.stack || err);
        })

    }).catch(Error, function (e) {
        // Any other error derived from standard Error
        console.error ("Error: " + e.message);
    }).catch(function (e) {
        // Other error such as a string was thrown
        console.error (e);
    });

    export default db;

Все хорошо. Но теперь я хотел бы иметь возможность вызывать инициализацию из произвольной точки в программе (есть кнопка для сброса и перезагрузки базы данных). Таким образом, примерно так:

    import Dexie from 'dexie'

    const db = new Dexie('myDatabase')
    const idb_schema_old = { myTable: '&key', }
    const idb_schema = { myTable: '&key', }
    const db_version_old = 9
    const db_version = 10

    init() {
        // NEW VERSION
        db.version(db_version_old).stores(idb_schema_old)
        db.version(db_version).stores(idb_schema)

        db.open().then(function(){
            // Success
        }).catch(Dexie.UpgradeError, function (e) {
            // Failed with UpgradeError
            console.error ("Upgrade error: " + e.message)
            console.log("Dropping database and installing latest version")
            db.delete()
            db.version(db_version).stores(idb_schema)
            db.open().catch(function (err) {
                console.error (err.stack || err);
            })

        }).catch(Error, function (e) {
            // Any other error derived from standard Error
            console.error ("Error: " + e.message);
        }).catch(function (e) {
            // Other error such as a string was thrown
            console.error (e);
        });
    }

    export default db;

Теперь инициализация - это функция, которую я хотел бы назвать чем-то вроде db.init(). Приведенный выше код неверен и не работает. Но как реализовать что-то подобное, где я мог бы вызвать функцию типаdb.init() или something.init()

На протяжении всей моей программы я уже import db и вызывать методы Dexie, я бы предпочел не переписывать все это.

1 ответ

Я думаю, что этот код неверно интерпретирует то, как Декси работает с обновлениями. Вам не нужно перехватывать UpgradeError и повторно инициализировать базу данных. Вы просто объявляете версию, которую используете, и Декси обновит базу данных при необходимости. В Dexie 3 вам также не нужно хранить старые версии схемы в коде, см. Обработка версий.

Кажется, вам нужно действие для удаления и воссоздания базы данных. Это должно быть сделано с помощью Dexie.delete() с последующим новым вызовом db.open (). Вы также можете использовать Table.clear для всех таблиц, но автоматически увеличивающиеся ключи не будут сброшены, и нет возможности изменить схему в этой операции.

async function recreateDatabase(db) {
  await db.delete();
  await db.open();
}

Вот также пример jsitor, который выполняет db.delete(), за которым следует db.open().

Другие вопросы по тегам