Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 始终使用RESTAdapter进行后端验证;适配器拒绝了提交,因为它无效;_Javascript_Ember.js_Ember Data - Fatal编程技术网

Javascript 始终使用RESTAdapter进行后端验证;适配器拒绝了提交,因为它无效;

Javascript 始终使用RESTAdapter进行后端验证;适配器拒绝了提交,因为它无效;,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,配置 后端=Laravel 5.1,带有Dingo API 前端=余烬1.13.6,余烬数据1.13.7 适配器=余烬数据重新适配器 问题 我正在尝试处理我的第一个Ember应用程序的后端验证错误。当服务器返回错误时,我得到以下错误: Error: The adapter rejected the commit because it was invalid at new Error (native) at Error.EmberError (http://localhost:4200/ass

配置

  • 后端=Laravel 5.1,带有Dingo API
  • 前端=余烬1.13.6,余烬数据1.13.7
  • 适配器=余烬数据重新适配器
问题

我正在尝试处理我的第一个Ember应用程序的后端验证错误。当服务器返回错误时,我得到以下错误:

Error: The adapter rejected the commit because it was invalid
at new Error (native)
at Error.EmberError (http://localhost:4200/assets/vendor.js:26266:21)
at Error.ember$data$lib$adapters$errors$$AdapterError (http://localhost:4200/assets/vendor.js:69564:50)
at Error.ember$data$lib$adapters$errors$$InvalidError (http://localhost:4200/assets/vendor.js:69637:52)
at ajaxError (http://localhost:4200/assets/frontend.js:16:24)
at ember$data$lib$system$adapter$$default.extend.ajax.Ember.RSVP.Promise.hash.error (http://localhost:4200/assets/vendor.js:71327:31)
at jQuery.Callbacks.fire (http://localhost:4200/assets/vendor.js:3350:30)
at Object.jQuery.Callbacks.self.fireWith [as rejectWith] (http://localhost:4200/assets/vendor.js:3462:7)
at done (http://localhost:4200/assets/vendor.js:9518:14)
at XMLHttpRequest.jQuery.ajaxTransport.options.send.callback (http://localhost:4200/assets/vendor.js:9920:8)
来自后端的响应具有422个不可处理的实体头,内容为:

{
     "message":"Couldn't save client",
     "errors":{
          "name":["The name field is required."],
          "email":["The email field is required."]
      },
     "status_code":422
}
尝试(和失败)的解决方案


  • 扩展RestaAdapter以覆盖ajaxError函数,我的当前外观如下:

    ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);
    if (jqXHR && jqXHR.status === 422) {
        var jsonErrors = Ember.$.parseJSON(jqXHR.responseText).errors;
        return new DS.InvalidError(jsonErrors);
    } else {
        return error;
    }
    }
    
  • 将catch语句添加到save方法时,我的save操作当前为:

     save() {
        var self = this;
    
        function transitionToPost(post) {
            self.transitionToRoute('clients.show', post);
        }
    
        function failure(reason) {
            // handle the error
            console.log(reason);
            return false;
        }
    
        this.get('model').save().then(transitionToPost, failure).catch(failure);
    }
    
  • 测试ActiveModelAdapter-不确定我期望这一个会带来什么,但我绝望了;结果还是一样

  • 余烬文档()
    正如您在上面的控制器代码中所看到的,我实际上使用它作为基础


请你看一下并提出建议好吗?提前感谢您的帮助

My
app/adapters/application.js

export default DS.RESTAdapter.extend({
  ajaxError(jqXHR) {
    var error, errors, jsonErrors, response;
    error = this._super(jqXHR);

    if (jqXHR && jqXHR.status === 422) {
      response = Ember.$.parseJSON(jqXHR.responseText);
      errors = {};
      if (response.errors != null) {
        jsonErrors = response.errors;
        Ember.keys(jsonErrors).forEach(function(key) {
          return errors[Ember.String.camelize(key)] = jsonErrors[key];
        });
      }
      return new DS.InvalidError(errors);
    } else {
      return error;
    }
  }
});
与用于型号的自定义
ServerErrorsMixin
结合使用:

export default Ember.Mixin.create({
  isntValid: Ember.computed.not('isValid').readOnly(),

  adapterDidInvalidate(errors) {
    let recordErrors = this.get('errors'),
        hasProp = {}.hasOwnProperty;

    for (let key in errors) {
      if (!hasProp.call(errors, key)) {
        continue;
      }

      let propertyErrors = errors[key];

      if(key === 'duplicate') {
        if(!Ember.isArray(propertyErrors)) {
          recordErrors
          .get('messages')
          .pushObject(propertyErrors);
        } else {
          Ember.debug('It shouldnt be an array.');
        }
      } else {
        for (let e of propertyErrors) {
          recordErrors
          .get(key)
          .pushObject(e);
        }
      }
    }

    this._saveWasRejected();
  }
});
在余烬数据
1.0.0-beta.18
中运行良好。如果尝试此操作,请记住从模型中的
ServerErrorsMixin
扩展:

import ServerErrorsMixin from '../mixins/server-errors';

export default DS.Model.extend(ServerErrorsMixin, {
  // ...
})

正如你所描述的,我刚刚尝试了这个,但是我仍然得到了同样的错误。它肯定是在使用ajaxError方法,我已经在控制台上记录了错误,但它从来没有在mixin中使用“adapterDidInvalidate”,我现在在我的模型中使用了它。好的,所以我卸载了ember数据并重新安装了它,然后一切都开始正常工作!