【发布时间】:2016-11-27 06:24:49
【问题描述】:
问题很简单,但即使通过互联网和 pouchdb 源进行详尽搜索,我也找不到检查本地数据库是否存在的函数。
这种情况的用例是检查本地数据库是否已经存在,然后选择是否成功登录。
最好的问候
【问题讨论】:
-
还是没有解决办法?
标签: javascript pouchdb
问题很简单,但即使通过互联网和 pouchdb 源进行详尽搜索,我也找不到检查本地数据库是否存在的函数。
这种情况的用例是检查本地数据库是否已经存在,然后选择是否成功登录。
最好的问候
【问题讨论】:
标签: javascript 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;
});
【讨论】:
我需要确认数据库已从客户的浏览器中删除。问题是您需要创建数据库才能删除它...
至少在 Chrome 上,Pouch 存储数据的默认方式是在带有前缀 _pouch_ 的 indexedDB 中。所以我只是删除了 indexedDB 数据库。
这是我的代码。它返回一个匹配 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"))
};
});
}
所以你可以使用类似的方法来检查它是否存在。如果存在,则 Promise 返回 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)
}
});
}
【讨论】: