可能保存模型时正在处理 ember-data 中的自定义服务器端错误

Posted

技术标签:

【中文标题】可能保存模型时正在处理 ember-data 中的自定义服务器端错误【英文标题】:is handling custom server side errors in ember-data when saving model possible 【发布时间】:2013-11-03 15:28:06 【问题描述】:

保存模型时是否有适当的方法来处理自定义错误?举个例子,假设我有一个只有两个属性“name”和“value”的模型。当我这样做时:

var myModel = this.get('store').createRecord('myModel', "name": "someName", "value": "someValue");
myModel.save().then(function() 
    //if success
    //server responded with "myModel:"id":1,"name":"someName","value":"someValue""
,function() 
    //if failure
    //server responded with "error":"some custom error message"
    //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE

);

解决此问题的一种方法是进行额外的 ajax 调用以检查名称是否唯一,然后进行保存。我只是想知道这里最好/优雅的方法是什么。

谢谢, 深

编辑:我认为在 groovy 中提供更多关于服务器端的上下文可能会有所帮助。所以这里是:

在我的控制器中,我有:

def create() 

    try 
        newRow = someService.create(params)
        render someService.list(newRow) as JSON//returns data in format needed by ember-data
    
    catch (ValidationException ex) 
        def errors = ["errors":[]]

        ex.errors.allErrors.each
            if(it.arguments[0] == "fieldName" && it.code=="constrantViolated")
                errors.errors.push(["field":it.arguments[0],"message":"some custom message"])
            
        
        //I am using 422 here because of post in http://***.com/questions/7996569/can-we-create-custom-http-status-codes
        render(status: 422, contentType: 'JSON', text: (errors as JSON))
    


然后在我的 ember 控制器中:

    var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON);
myModel .save().then(function () 
        //if success
                ,
    function (response) 
        myModel .deleteRecord();
        var errors = $.parseJSON(response.responseText);
        for (var key in errors.errors) 
            //do something
        
    );

【问题讨论】:

【参考方案1】:

deleteRecord 将删除记录。

myModel.save().then(function(response) 
  //if success
  //server responded with "myModel:"id":1,"name":"someName","value":"someValue""
,function(response) 
  //if failure
  //server responded with "error":"some custom error message"
  //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE
  if(response.error=='no good')
    myModel.deleteRecord();
  

);

【讨论】:

谢谢。我最初对如何获取 response.error 有疑问,但后来我想出了如何使用正确的 HTTP 错误代码发送响应文本并获取 responseText。 我现在也是这样做的,但我不喜欢它开始显示记录并在服务器应答后将其删除。有没有办法等待服务器回答显示持久化记录?【参考方案2】:

您可以通过在模型中添加属性来处理模型中的错误:

becameError: ->
  # handle error case here
  alert 'there was an error!'

becameInvalid: (errors) ->
  # record was invalid
  alert "Record was invalid because: #errors"

检查:How should errors be handled when using the Ember.js Data RESTAdapter?

【讨论】:

【参考方案3】:

为什么不直接使用:DS.ERRORS CLASS?

来自 EmberJS 文档:

例如,如果您的 User 模型如下所示:

App.User = DS.Model.extend( username: attr('string'), email: attr('string') );

并且您尝试保存未在后端验证的记录。

var user = store.createRecord('user', 
  username: 'tomster',
  email: 'invalidEmail'
);
user.save();

您的后端数据存储可能会返回如下所示的响应。此响应将用于填充错误对象。


  "errors": 
    "username": ["This username is already taken!"],
    "email": ["Doesn't look like a valid email."]
  

可以通过访问他们的属性名称或使用 messages 属性获取所有错误的数组来向用户显示错误。

#each errors.messages
  <div class="error">
    message
  </div>
/each

这个问题是否只关注模型的验证?与持久性/保存它相比,因此数据在到达数据存储之前就已经是干净的了......似乎您仍然希望在适配器数据存储级别进行错误管理。

说了这么多,为什么不在 UI 控件级别使用模板或基于普通的 JS 验证?

【讨论】:

问题出现是因为我不知道如何获取保存问题时可能弹出的服务器端错误。是的,我们在保存模型之前确实验证了模型,但有时服务器可能已关闭,或者某些验证只能在服务器级别完成(例如检查唯一性等),我们只是想在用户界面。我目前正在做的事情与您的建议非常相似 - 因此所有服务器端错误和客户端错误总是被推送到同一个数组,并且不需要在 UI 中进行太多更改以显示错误。谢谢。 我明白了...您的服务器端的架构是什么?它是一个 Ruby on Rails 环境,具有基于 sql 类型的数据库,最终所有数据都被存储了吗?或者更简单的东西 - Rest --> Firebase? 以上文字出处供参考emberjs.com/api/data/classes/DS.Errors.html

以上是关于可能保存模型时正在处理 ember-data 中的自定义服务器端错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ember-data 模型中表示数组?

Ember-Data:“映射”如何工作

ember data 不同模型用于同一端点

EmberJS:更改加载模型的 url (ember-data)

获取 ember-data 模型中任何属性的属性类型

从Ember-Data格式化Web API 2的Json