ember.js RestAdapter如何定义ajaxoptions

时间:2018-01-22 20:52:35

标签: mongodb ember.js restheart

我自定义 RESTAdapter 以连接到RestHeart服务器(RestFull网站)  mongodb的网关服务器):

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  host:'http://127.0.0.1:8080',
  namespace: 'boards'
});

我创建了一个测试模型:

import DS from 'ember-data';

export default DS.Model.extend({
  identity: DS.attr()
});

一切正常,但是当我在记录上使用save方法时(开发人员): 我在浏览器控制台中收到警告:

  

服务器为POST返回一个空字符串   http://.../boards/Developer,无法解析为有效的JSON。   返回null或{}。

以及以下错误:

  

SyntaxError:JSON输入的意外结束       在解析()       在ajaxConvert(jquery.js:8787)       完成后(jquery.js:9255)       在XMLHttpRequest。 (的jquery.js:9548)

我知道原因: RESTAdapter正在等待JSON响应,并且restHeart服务器在添加=>时返回空响应。因此jQuery在尝试解析空响应时会导致错误。

使用以前版本的ember-data,可以使用钩子 ajaxOptions 以这种方式将jQuery ajax请求的dataType变量设置为'*':

export default DS.RESTAdapter.extend({
  ajaxOptions(url, type, options) {
    var hash = this._super(url, type, options);
    hash.dataType = "*";
    return hash;
  },
  host:'http://127.0.0.1:8080',
  namespace: 'boards'
});

使用ember-data 2.16, ajaxOptions 现在是私有的,我不知道如何修改dataType变量......这样就不会将null响应解析为JSON响应

版本:

  • ember-data 2.16
  • ember 2.18

1 个答案:

答案 0 :(得分:1)

找到解决方案

export default DS.RESTAdapter.extend({
  ajaxOptions: function(url, type, options) {
    // get the default RESTAdapter 'ajaxOptions'
    var hash = this._super(url, type, options);

    // override if it's a POST request
    if (type == 'POST') {
      hash.dataType = 'text';
    }
    return hash;
  },

  ajaxSuccess: function(jqXHR, data) {
    if (typeof data === 'string') {
      // return an empty object so the Serializer handles it correctly
      return {};
    } else {
      return data;
    }
  },
  host:'http://127.0.0.1:8080',
  namespace: 'boards'
});

它没有任何警告或错误,奇怪的是, 因为我不知道我是否尊重RESTAdapter类的封装......

请参阅Ember-data 2.6 & 2.7 release notes