在我的Angular项目中,在不同的地方获取PouchDB文档。我想处理所有db.get()
函数的401错误。有没有办法在没有捕获的情况下处理http错误?
db.get('mydoc').then(function (doc) {
// handle doc
}).catch(function (err) {
console.log(err);
});
答案 0 :(得分:2)
没有。您需要在异常部分处理它,因为401被视为exception。 在异常逻辑中处理异常并从代码中分离异常逻辑总是好的。假设你的代码是这样的:
db.get('mydoc').then(function (doc) {
//regular code
}).catch(function (err) {
//Exception logic
});
如果您尝试处理异常部分之外的异常,则意味着您希望将错误带入常规代码中,这是有意义的,甚至是危险的。
答案 1 :(得分:0)
我遇到了类似的情况。
您可以通过两种方式解决此问题,具体取决于您是否使用实时复制。
没有复制:
catch(err)
处理程序附加到db.get()
PouchDbService
,并将其注入Angular Component(s)构造函数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) } }
PouchDbService
并使用您自己的dbGet()
逻辑调用.then()
方法。 注意:在我的实现非 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)