配置
- 后端 = Laravel 5.1,带有 Dingo API
- 前端 = Ember 1.13.6,Ember 数据 1.13.7
- 适配器 = Ember 数据 RESTAdapter
问题
我正在尝试处理我的第一个 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 Unprocessable Entity头,内容是:
{
"message":"Couldn't save client",
"errors":{
"name":["The name field is required."],
"email":["The email field is required."]
},
"status_code":422
}
尝试(和失败)的解决方案
Ember data Rest adapter error handling not working
扩展 RESTAdapter 以覆盖 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; } }
在save方法中加入catch语句,目前我的save Action 是:
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 - 不确定我期望用这个实现什么,但我很绝望;结果还是一样。
Ember 文档 ( http://guides.emberjs.com/v1.13.0/models/creating-updating-and-deleting-records/#toc_promises )
正如您在上面我的 Controller 代码中看到的,我实际上将其用作基础
请您看看并提出建议?在此先感谢您的帮助!
最佳答案
我的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();
}
});
在 Ember Data 1.0.0-beta.18
中运行良好。如果您尝试这样做,请记住从模型中的 ServerErrorsMixin
进行扩展:
import ServerErrorsMixin from '../mixins/server-errors';
export default DS.Model.extend(ServerErrorsMixin, {
// ...
})
关于javascript - 使用 RESTAdapter 的后端验证始终为 "The adapter rejected the commit because it was invalid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864187/