1

我有一个由 RESTful API 支持的 Ember.js 应用程序。会话控制是通过身份验证令牌完成的:一旦用户登录,他会将他的身份验证令牌附加到他向服务器发出的每个请求中。我通过将身份验证添加到$.ajaxSetup.

$.ajaxSetup({
  data: { auth_token: this.get('authToken') }
});

现在,这适用于 GET 请求。但是,当通过 POST 或 PUT 请求将模型保存到服务器时,Ember Data RESTAdapter 会将数据对象字符串化。在DS.RESTAdapter.ajax它确实

....
if (hash.data && type !== 'GET') {
  hash.contentType = 'application/json; charset=utf-8';
  hash.data = JSON.stringify(hash.data);
}
...

因此,身份验证令牌不会合并到数据中。在这张 jQuery 票证中,他们说这是他们永远不会支持的东西。

解决这个问题的最优雅的方法是什么?我宁愿不重写 Ember 的RESTAdapter.ajax函数,因为代码变化如此之快,所以我重写的函数可能与下一个版本的代码库的其余部分不兼容。

4

1 回答 1

1

最后,除了覆盖之外,我找不到其他解决方案RESTAdapter.ajax。我最终添加了三个参数auth[token]auth[school]auth[name]

DS.RESTAdapter.reopen({
  /* Override to add the authToken, school and name */
  ajax: function(url, type, hash) { 
    var adapter = this;

    return new Ember.RSVP.Promise(function(resolve, reject) { 
      hash = hash || {};
      hash.url = url;
      hash.type = type;
      hash.dataType = 'json';
      hash.context = adapter;

      if (hash.data && type !== 'GET') { 
        hash.contentType = 'application/json; charset=utf-8';

        /* Add the data to the hash before it's stringified. */
        if (HstryEd.Session.get('isLoggedIn')) { 
          hash.data.auth = {};
          hash.data.auth.token = HstryEd.Session.get('authToken');
          hash.data.auth.school = HstryEd.Session.get('currentUser').get('school');
          hash.data.auth.name = HstryEd.Session.get('currentUser').get('name');
        } 

        hash.data = JSON.stringify(hash.data);
      } 

      if (adapter.headers !== undefined) { 
        var headers = adapter.headers;
        hash.beforeSend = function (xhr) { 
          forEach.call(Ember.keys(headers), function(key) { 
            xhr.setRequestHeader(key, headers[key]);
          });
        };
      } 

      hash.success = function(json) { 
        Ember.run(null, resolve, json);
      };

      hash.error = function(jqXHR, textStatus, errorThrown) { 
        if (jqXHR) { 
          jqXHR.then = null;
        } 

        Ember.run(null, reject, jqXHR);
      };

      Ember.$.ajax(hash);
    });
  } 
});
于 2013-10-22T15:02:18.310 回答