【问题标题】:durandal router activator catch 401 exceptiondurandal 路由器激活器捕获 401 异常
【发布时间】:2014-08-30 19:57:33
【问题描述】:

在激活先前已授权的路线时,捕捉未授权 401 的最佳位置在哪里。当授权令牌不再有效时会发生这种情况,如果用户尝试激活路由,则会出现 401 错误。 Durandal 中的异常在 activateItem 级别引发,不知道如何为其定义全局处理程序。

注意。 mapUnknownRoutes 在这种情况下没有用

【问题讨论】:

  • 什么会抛出 401?如果您在生产中,除非您在使用 weyland 或 grunt 或任何构建工具时在调试模式下运行,否则您永远不会得到 401。
  • .NET 中的 Web API 例如,如果您不再被授权调用 api,则会抛出 401。
  • 当然,但 Durandal 的路由器不会调用 API。您将使用 jQuery 或其他东西来进行调用,以处理失败的情况。我可以发布一个示例作为答案。

标签: http knockout.js durandal


【解决方案1】:

您从调用 API 的任何位置捕获调用。如果您使用 jQuery 进行调用,您是否会使用 fail 方法处理 AJAX 调用失败 -

$.ajax({
    url: url,
    data: { start: start, end: end },
    success: function(data, textStatus, jqXHR) {
        $('#myElement').append(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        if (jqXHR.status === '401') {
            // do something
        }
    }
});

这给了你状态码,我不记得它是字符串还是整数格式,所以这显然是伪代码

【讨论】:

  • 在激活器尝试激活路由时进行调用。我同意你的观点,路由器的工作在检测到路由有效的那一刻就完成了。这就是为什么当模块的激活因 401 而失败时,我试图找到一个全局处理程序。
  • 您始终可以向路由器返回一个承诺,该承诺将推迟激活完成,直到承诺解决。如果模块无法加载并且您不想通过调用来处理故障,我想您可以尝试使用像 require.js 提供的全局故障处理程序,但我不确定这是正确的用例 - requirejs.org/docs/api.html#requirejsonerror
  • 这需要专门处理我支持授权的每个模块中的故障。更希望在某处连接到路由器,以提供全局处理。我认为理想的位置是连接到路由器的激活器的 activeItem。不过,我没有这个钩子。也有guardRoute,但之后发生异常。
  • 似乎关注点分离不佳 - 为什么不使用服务并在服务级别处理故障,而不是尝试在路由器中捕获它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2012-01-01
  • 2018-02-09
  • 2016-05-23
  • 2019-07-16
  • 2014-07-01
相关资源
最近更新 更多