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

Does PouchDB have a http interceptor for fetching documents

在我的 Angular 项目中,在不同的地方获取 PouchDB 文档。我想处理所有 db.get() 函数的 401 错误。有没有一种方法可以毫不费力地处理 http 错误?

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

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

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

如果你试图在异常部分之外处理异常,这意味着你想将错误带入常规代码中,这是没有意义的,甚至是危险的。

我遇到过类似的情况。

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

没有复制:

  1. 您必须将 catch(err) 处理程序附加到 db.get()
  2. 为了减轻痛苦,创建一个 Angular 服务来处理您所有的数据库调用,即 PouchDbService,并将其注入到您的 Angular 组件中构造函数
  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 组件中,注入 PouchDbService 并使用您自己的 .then() 逻辑调用 dbGet() 方法。 注意:在我的实现中 401/403 异常仍然会被抛出,因此您可能仍要处理它们。
    pouchService.dbGet('mydoc')
      .then(function (result) {
        // only reach here if auth succeeded
        // if 401/403, service would have already executed logout logic
      });


实时复制:(更简单)

  1. 将错误处理程序添加到您的复制引用
    replicationRef = db.replicate.from('http://remote', opts);

    replicationRef.on('error', checkIfAuthError)