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);                                                                                                                                                                                                    
  }                                                                                                                                                                                                                                      
}