PouchDB 检查本地数据库是否存在

PouchDB check if local database exists

问题很简单,但即使通过互联网和 pouchdb 源进行详尽搜索,我也找不到检查本地数据库是否存在的函数。

此用例是检查本地数据库是否已存在,然后将成功登录设为可选。

此致

确实有一个 skip_setup 选项可用。

the documentation所述,默认情况下,PouchDB 将检查数据库是否存在,如果不存在则尝试创建它。您可以将此选项设置为 true 以跳过此设置。

启用此选项后,如果查询数据库信息时数据库不存在,您将得到一个错误,例如:

const db = new PouchDb('DB_URL_OR_NAME', { skip_setup: true });

db.info()
  .then(() => {
    // The database exists.
    // Do something...
  })
  .catch(e => {
    // No database found and it was not created.
    // Do something else...
  });

正如 akofman 所指出的,skip_setup 不适用于本地数据库。所以我知道的唯一方法是解决方法——检查新数据库是否为空,然后立即删除它。当然,如果有问题的数据库存在但为空,这没有帮助...

const testdb = new PouchDB('testdb_name');

testdb.info().then(function (details) {
if (details.doc_count == 0 && details.update_seq == 0) {
    alert ('database does not exist');
    testdb.destroy().then (function() {console.log('test db removed');});
}
else alert ('database exists');
})
.catch(function (err) {
   console.log('error: ' + err);
return;
});

我需要确认数据库已从我客户的浏览器中删除。问题是您需要创建数据库才能删除它...

Pouch 存储数据的默认方式(至少在 Chrome 上)是在前缀为 _pouch_ 的索引数据库中。所以我只是删除了 indexedDB 数据库。

这是我的代码。它 returns 承诺匹配 PouchDB 语法。

function deletePouchDatabase(dbName) {
  return new Promise((resolve, reject) => {
    var req = indexedDB.deleteDatabase('_pouch_' + dbName);
    req.onsuccess = function () {
      resolve(null)
    };
    req.onerror = function () {
      reject(new Error("There was an error"))
    };
    req.onblocked = function () {
      reject(new Error("The operation was blocked"))
    };
  });
}

所以你可以使用类似的方法来检查它是否存在。承诺 returns true 如果存在,false 如果不存在。

function pouchDatadatabaseExists(dbname) {
  return new Promise((resolve, reject) => {
    const req = indexedDB.open(`_pouch_${dbname}`);
    req.onsuccess = function () {
      resolve(true)
    }
    req.onupgradeneeded = function () {
      resolve(false)
    }
  });
}