【问题标题】:Looking for direction on a pouchdb error寻找 pouchdb 错误的方向
【发布时间】:2023-03-15 00:18:01
【问题描述】:
error:"unauthorized"
id:"_design/db"
message:"You are not a db or server admin."
name:"unauthorized"
ok:true
reason:"You are not a db or server admin."
rev:"137-81fe83389359c1cfb50bf928f3558b81"
status:500

在完全卸载/重新安装应用程序后,Pouchdb 正在尝试推送设计文档(因此本地 pouchdb 应该已被删除)。我猜这是在某处的更改流中。但奇怪的是,couchdb 的版本是 133,而不是 137。

我该如何解决这个问题?我尝试了一个紧凑的,但没有奏效。我能想到的唯一明显的答案是手动对沙发上的设计进行大量修改,使其比 137 更新。

我使用此代码对更改流进行了搜索

var http=require('http');
var url = "http:/server/db/_changes?style=all_docs";
http.get(url, function(res){
    var body = '';

    res.on('data', function(chunk){
        body += chunk;
    });

    res.on('end', function(){
        var test = JSON.parse(body);
        test.results.forEach(function(item,index){
            if (item.id==="_design/db"){
                console.log(item);
            }
        });
    });
}).on('error', function(e){
    console.log("Got an error: ", e);
});

得到了 1 个结果,rev 133,正确的结果。那么 pouchdb 是从哪里得到的呢?

--编辑 删除 pouch 数据库似乎可以修复它,直到下一次应用安装。

【问题讨论】:

  • 据我所知,unauthorized 表示您必须提供管理员用户名/密码?
  • 这真的只是因为手机有一些未来版本的设计文档,它没有权限推回沙发上。但似乎每次安装应用程序时,Android 都会以某种方式恢复这个未来版本。
  • @user3405291 我已将问题部分隔离到 Android 7.1。在应用程序升级或卸载时,cordova 不再使用 webview(不知道它使用的是什么)。无论它使用的是保留所有 cookie、pouchdb、IndexDB 和一些离线存储。 SQLlite 似乎已被删除,但我正在彻底测试。

标签: couchdb pouchdb


【解决方案1】:

错误状态码为500,基于the documentation为:

500 - 内部服务器错误

请求无效,或者是因为提供的 JSON 无效, 或作为请求的一部分提供了无效信息。

另外,错误信息和原因提到:

消息:“您不是数据库或服务器管理员。”

原因:“您不是数据库或服务器管理员。”


我认为该错误可能是由数据库管理员和成员权限引起的。因为,普通数据库member用户/角色不能PUT设计文档,只有数据库admin用户/角色可以PUT设计文档:


你提到过:

这真的只是因为手机有一些未来的版本 设计文档...

如果修订有问题,应该收到409 - Conflict 错误而不是500 - Internal Server Error


我不确定,只是一个想法。

【讨论】:

  • 它正在尝试推送设计文档的未来版本,但作为无权这样做的用户。所以拒绝访问是有道理的。
【解决方案2】:

事实证明,Android 现在使用 google drive 来备份 indexdb。这导致已安装的应用程序版本在测试期间数据库回滚后不断获取文档的未来版本。 我发现的唯一方法就是这样做。

.on('denied', function (result) {
    if (result.doc.error === "unauthorized" && result.doc.id === "_design/db") {
        //catastrophic failure
        var DBDeleteRequest = window.indexedDB.deleteDatabase("_pouch_");

        DBDeleteRequest.onerror = function (event) {
            console.error("Error deleting database.");
            throw new Error("Error deleting database.");
        };

        DBDeleteRequest.onsuccess = function (event) {
            console.log("Database deleted successfully");
            window.location.reload(); //reload the app after purge
        };
    }
}

即使是 pouchdb.destroy 也不能完全解决问题。轨道解决方案有点像核武器。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 2018-03-27
    • 2020-02-26
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多