PouchDB是否有用于获取文档的http拦截器

时间:2017-11-07 15:12:46

标签: angularjs promise pouchdb

在我的Angular项目中,在不同的地方获取PouchDB文档。我想处理所有db.get()函数的401错误。有没有办法在没有捕获的情况下处理http错误?

db.get('mydoc').then(function (doc) {
  // handle doc
}).catch(function (err) {
  console.log(err);
});

2 个答案:

答案 0 :(得分:2)

没有。您需要在异常部分处理它,因为401被视为exception。 在异常逻辑中处理异常并从代码中分离异常逻辑总是好的。假设你的代码是这样的:

db.get('mydoc').then(function (doc) {
  //regular code
}).catch(function (err) {
  //Exception logic
});

如果您尝试处理异常部分之外的异常,则意味着您希望将错误带入常规代码中,这是有意义的,甚至是危险的。

答案 1 :(得分:0)

我遇到了类似的情况。

您可以通过两种方式解决此问题,具体取决于您是否使用实时复制

没有复制:

  1. 您必须将catch(err)处理程序附加到db.get()
  2. 为了减轻痛苦,创建一个Angular服务来处理所有数据库调用,即PouchDbService,并将其注入Angular Component(s)构造函数
  3. 您的PouchDbService应包含类似
  4. 的内容
        db;  // new PouchDB() reference
    
        dbGet(id, opts) {
          opts = opts || {};
          return db.get(id, opts)
            .catch(err, checkIfAuthError)
        }
    
        checkIfAuthError(err) {
          if (err && err.error) {
            if (err.status && (err.status === 401 || err.status === 403)) {
              return navigateToLogin();  // your logout logic, i.e. simple router, or logout service
            } else {
              throw(err);
            }
          } else {
            return Promise.resolve(false)
          }
        }
    
    1. 然后在Angular Component中,注入PouchDbService并使用您自己的dbGet()逻辑调用.then()方法。 注意:在我的实现 401/403中,仍然会抛出异常,因此您可能仍希望处理它们。
    2.     pouchService.dbGet('mydoc')
            .then(function (result) {
              // only reach here if auth succeeded
              // if 401/403, service would have already executed logout logic
            });
      
      
      

      使用实时复制:(更简单)

      1. 向复制引用添加错误处理程序
      2.     replicationRef = db.replicate.from('http://remote', opts);
        
            replicationRef.on('error', checkIfAuthError)