vue-resource:拦截 ajax 错误时捕获 "Uncaught (in promise)"
vue-resource: catch "Uncaught (in promise)" when intercepting an ajax error
我正在使用 vue-resource
从服务器获取数据。用户需要拥有 JWT 令牌才能获取正确的数据。如果令牌无效或过期,则返回 401 状态。如果用户尝试访问禁止访问的页面,则会返回 403。
我想捕获这些错误并适当地(全局)处理它们。这意味着,调用应该完全由拦截器处理(如果是 401、403)。
如何防止浏览器消息 "Uncaught (in promise)" 并创建一些全局错误处理?我不想在每次调用时都有本地错误处理程序。
我有以下拦截器:
Vue.http.interceptors.push(function (request, next) {
request.headers.set('Authorization', Auth.getAuthHeader());
next(function (response) {
if (response.status === 401 || response.status === 403) {
console.log('You are not logged in or do not have the rights to access this site.');
}
});
});
然后在 Vue 中调用如下 methods
:
methods: {
user: function () {
this.$http.get('http://localhost:8080/auth/user').then(function (response) {
console.log(response);
});
}
}
这有点进退两难,不是吗。您不希望未处理的承诺拒绝被吞没,因为这意味着您的应用程序可能无法运行并且您不知道原因,并且永远不会收到错误发生的报告。
另一方面,对应用程序中的每个 .catch()
语句使用完全相同的错误处理机制是愚蠢的,因此实现全局错误处理程序绝对是可行的方法。
问题是在大多数情况下,您将有到re-throw来自全局错误处理程序的错误,否则您的应用程序会认为请求已通过好的,将继续处理数据,这些数据将不存在。
但这会导致出现 Uncaught (in promise)
错误的情况,因为浏览器会认为您没有处理错误,而实际上您在全局错误处理程序中处理了错误。
为了解决这个问题,现在有 onunhandledrejection
事件,您可以使用它来防止浏览器记录这些错误,但是您必须确保自己处理它们。
所以我们经常做的是有我们自己的错误类,当抛出响应错误时,我们将错误转换为我们的错误之一类,这取决于HTTP状态代码.
我们还将 属性 附加到此错误,例如 ignoreUnhandledRejection
并将其设置为 true
。然后,你可以使用全局处理程序来过滤掉那些错误并忽略它们,因为你知道你已经在全局处理了它们:
/**
* Prevent logging already processed unhandled rejection in console
*/
window.addEventListener('unhandledrejection', event => {
if (event.reason && event.reason.ignoreUnhandledRejection) {
event.preventDefault();
}
});
我正在使用 vue-resource
从服务器获取数据。用户需要拥有 JWT 令牌才能获取正确的数据。如果令牌无效或过期,则返回 401 状态。如果用户尝试访问禁止访问的页面,则会返回 403。
我想捕获这些错误并适当地(全局)处理它们。这意味着,调用应该完全由拦截器处理(如果是 401、403)。
如何防止浏览器消息 "Uncaught (in promise)" 并创建一些全局错误处理?我不想在每次调用时都有本地错误处理程序。
我有以下拦截器:
Vue.http.interceptors.push(function (request, next) {
request.headers.set('Authorization', Auth.getAuthHeader());
next(function (response) {
if (response.status === 401 || response.status === 403) {
console.log('You are not logged in or do not have the rights to access this site.');
}
});
});
然后在 Vue 中调用如下 methods
:
methods: {
user: function () {
this.$http.get('http://localhost:8080/auth/user').then(function (response) {
console.log(response);
});
}
}
这有点进退两难,不是吗。您不希望未处理的承诺拒绝被吞没,因为这意味着您的应用程序可能无法运行并且您不知道原因,并且永远不会收到错误发生的报告。
另一方面,对应用程序中的每个 .catch()
语句使用完全相同的错误处理机制是愚蠢的,因此实现全局错误处理程序绝对是可行的方法。
问题是在大多数情况下,您将有到re-throw来自全局错误处理程序的错误,否则您的应用程序会认为请求已通过好的,将继续处理数据,这些数据将不存在。
但这会导致出现 Uncaught (in promise)
错误的情况,因为浏览器会认为您没有处理错误,而实际上您在全局错误处理程序中处理了错误。
为了解决这个问题,现在有 onunhandledrejection
事件,您可以使用它来防止浏览器记录这些错误,但是您必须确保自己处理它们。
所以我们经常做的是有我们自己的错误类,当抛出响应错误时,我们将错误转换为我们的错误之一类,这取决于HTTP状态代码.
我们还将 属性 附加到此错误,例如 ignoreUnhandledRejection
并将其设置为 true
。然后,你可以使用全局处理程序来过滤掉那些错误并忽略它们,因为你知道你已经在全局处理了它们:
/**
* Prevent logging already processed unhandled rejection in console
*/
window.addEventListener('unhandledrejection', event => {
if (event.reason && event.reason.ignoreUnhandledRejection) {
event.preventDefault();
}
});