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
});
如果你试图在异常部分之外处理异常,这意味着你想将错误带入常规代码中,这是没有意义的,甚至是危险的。
我遇到过类似的情况。
您可以通过两种方式解决它,具体取决于您是否使用实时复制。
没有复制:
- 您必须将
catch(err)
处理程序附加到 db.get()
- 为了减轻痛苦,创建一个 Angular 服务来处理您所有的数据库调用,即
PouchDbService
,并将其注入到您的 Angular 组件中构造函数
- 您的
PouchDbService
应该包含类似 的内容
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)
}
}
- 然后在您的 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
});
实时复制:(更简单)
- 将错误处理程序添加到您的复制引用
replicationRef = db.replicate.from('http://remote', opts);
replicationRef.on('error', checkIfAuthError)
在我的 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
});
如果你试图在异常部分之外处理异常,这意味着你想将错误带入常规代码中,这是没有意义的,甚至是危险的。
我遇到过类似的情况。
您可以通过两种方式解决它,具体取决于您是否使用实时复制。
没有复制:
- 您必须将
catch(err)
处理程序附加到db.get()
- 为了减轻痛苦,创建一个 Angular 服务来处理您所有的数据库调用,即
PouchDbService
,并将其注入到您的 Angular 组件中构造函数 - 您的
PouchDbService
应该包含类似 的内容
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) } }
- 然后在您的 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 });
实时复制:(更简单)
- 将错误处理程序添加到您的复制引用
replicationRef = db.replicate.from('http://remote', opts); replicationRef.on('error', checkIfAuthError)