ember-data api 中的错误响应
Error response in ember-data api
我将文档保存到 API 的代码看起来像这样
save(category) {
category.save().then(() => {
this.transitionTo('categories');
}).catch((adapterError) => {
console.log(category.get('errors').toArray());
console.log(category.get('isValid'));
});
},
当 API 答案是:
{"errors":[{"attribute":"name","message":"This value should not be blank."}]}
然后
category.get('isValid')
仍然returns正确。
我的问题是,验证错误应该是什么样子?
默认情况下,ember-data 的适配器在状态码为 422 时确定响应无效。您可以覆盖适配器的 isInvalid
函数来更改此设置。
此外,ember-data 现在需要将错误格式化为 json-api 错误对象。如果您的后端没有 return 这种格式,您可以通过覆盖适配器的 handleResponse
函数将其转换为 ember。
这是一个示例 json-api 错误:
{"errors": [
{
"detail": "Must be unique",
"source": { pointer: "/data/attributes/title"}
},
{
"detail": "Must not be blank",
"source": { pointer: "/data/attributes/content"}
}
]}
如果您return收到上述错误响应,则必须在您的适配器中执行类似的操作:
handleResponse(status, headers, payload) {
if (status === 422 && payload.errors) {
let jsonApiErrors = [];
for (let key in payload.errors) {
for (let i = 0; i < payload.errors[key].length; i++) {
jsonApiErrors.push({
detail: payload.errors[key][i],
source: {
pointer: `data/attributes/${key}`
}
});
}
}
return new DS.InvalidError(jsonApiErrors);
} else {
return this._super(...arguments);
}
}
我将文档保存到 API 的代码看起来像这样
save(category) {
category.save().then(() => {
this.transitionTo('categories');
}).catch((adapterError) => {
console.log(category.get('errors').toArray());
console.log(category.get('isValid'));
});
},
当 API 答案是:
{"errors":[{"attribute":"name","message":"This value should not be blank."}]}
然后
category.get('isValid')
仍然returns正确。
我的问题是,验证错误应该是什么样子?
默认情况下,ember-data 的适配器在状态码为 422 时确定响应无效。您可以覆盖适配器的 isInvalid
函数来更改此设置。
此外,ember-data 现在需要将错误格式化为 json-api 错误对象。如果您的后端没有 return 这种格式,您可以通过覆盖适配器的 handleResponse
函数将其转换为 ember。
这是一个示例 json-api 错误:
{"errors": [
{
"detail": "Must be unique",
"source": { pointer: "/data/attributes/title"}
},
{
"detail": "Must not be blank",
"source": { pointer: "/data/attributes/content"}
}
]}
如果您return收到上述错误响应,则必须在您的适配器中执行类似的操作:
handleResponse(status, headers, payload) {
if (status === 422 && payload.errors) {
let jsonApiErrors = [];
for (let key in payload.errors) {
for (let i = 0; i < payload.errors[key].length; i++) {
jsonApiErrors.push({
detail: payload.errors[key][i],
source: {
pointer: `data/attributes/${key}`
}
});
}
}
return new DS.InvalidError(jsonApiErrors);
} else {
return this._super(...arguments);
}
}