错误回调后重新调用Backbone.Sync方法

Re-call Backbone.Sync method after error callback

本文关键字:调用 Backbone Sync 方法 回调 新调用 错误      更新时间:2023-09-26

我正在开发一个应用程序,如果我们的Bearer令牌已过期,我们将从服务器返回401。我们想调用一个端点/api/newToken,并将新的承载令牌设置为cookie(稍后将添加到头中),然后重新调用发生错误时调用的URL(401状态)。

我们覆盖了主干同步方法

var sync_mixin = {
        // `preSync` is a useful hook from which events can be published,
        //      and options / model may be modified.
        preSync: function (method, model, options) {},
        // override sync to:
        //  - call preSync first
        //  - because tastypie and backbone disagree on whether delete should have trailing slash
        sync: function (method, model, options) {
            model.preSync(method, model, options);
            options = options || {};
            options.headers = getAuthHeaders()
            // Add trailing slash to backbone model views
            var _url = _.isFunction(model.url) ?  model.url() : model.url;
            // Missing the case where there is a query string on a detail view here: /v7.0/<resource>/<id>?key=val
            _url += _url.charAt(_url.length - 1) == '/' || _url.indexOf('?') != -1 ? '' : '/';
            options = _.extend(options, {
                url: _url,
                model: model
            });
            if (method.toLowerCase() === 'delete') {
                if (!options.url) {
                    options.url = _.result(model, 'url').replace(/'/$/, "") + '/';
                }
            }
            return Backbone.sync.apply(this, arguments);
        }
    };
    Backbone.Model = Backbone.Model.extend(sync_mixin);

理想情况下,我希望一次性处理错误(而不是在每个模型文件中)。我试图实现的是,当我在sync上得到错误时,调用api端点获取新的令牌,将其设置为cookie,并用新的cookie作为令牌重新调用原始sync方法。以下是我尝试过的,但我遇到了最大的调用堆栈错误。我在上面的同步功能中添加了这个代码

            options.error = function(xhr, status, thrown) {
              if(xhr.status === 401 || xhr.status === 403){
                  $.cookies.set("auth-token", '6fe36b69cdac549339850a5aa2f148b470dc2e0e');
                  Backbone.sync.apply(this.model, arguments);
              }
            }

关于如何解决这个问题有什么建议吗?我可以得到任何其他需要的东西。

我完成了这项工作。Tte max调用堆栈错误是由于我意外地将请求添加回进行递归调用的选项。

这是我的代码,允许调用同步

    var errorHandler = options.error;
    options.error = function(xhr) {
      var errorHandlerArgs = arguments;
      if ((xhr.status === 401 || xhr.status === 0) && $this.ajaxTried < 3) {
          $this.ajaxTried++;
          //call refresh_bearer/ URL 
          $.ajax({
            url: "/api/refresh_bearer/",
            headers: args[2].headers
          }).done(function (data) {
            args[2].headers = getAuthHeaders()
            Backbone.sync.apply($this, args);
          });
      } else {
          $this.ajaxTried = 0;
          errorHandler.apply($this, errorHandlerArgs);
      }
    };