【问题标题】:is handling custom server side errors in ember-data when saving model possible可能保存模型时正在处理 ember-data 中的自定义服务器端错误
【发布时间】: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://stackoverflow.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
        }
    });

【问题讨论】:

    标签: ember.js ember-data grails-2.0


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多