backbonejs模型如何处理服务器端错误?

Ale*_*rov 6 backbone.js

backbonejs模型如何处理服务器端错误?

当我发送带有错误数组的json时,我仍然会在响应参数内部获得成功回调错误数组.

小智 7

在我的客户端代码中,我检查是否存在errors属性并根据需要做出反应.

例如,我使用的是Collection.create函数,如果请求成功,它会调用Collection的add函数.因此,我覆盖了我的Collection的添加功能,以防止在具有'errors'属性的情况下添加模型,并且如果它不调用"super"方法.

add: function(object, options) {
    if (_.isArray(object) || !object.get('errors')) {
        Backbone.Collection.prototype.add.call(this, object, options)
    }
},
Run Code Online (Sandbox Code Playgroud)

让我的应用程序返回非成功状态代码也会起作用,因为它会阻止运行成功回调.但是,我不喜欢因为提交无效而返回400错误的想法.这是我在非Backbone.js应用程序中从未做过的事情.( "无脊椎动物"?)

4XX状态代码的描述似乎都没有真正符合验证失败的概念.400和403接近,但仍然像它们用于其他用途一样脱落.另一方面,用户实际上并不关心您返回的状态代码; 也许是404.

这真的是你想要编写更多代码服务器端还是客户端.我的应用程序或多或少忽略了验证的结果,并将序列化的记录返回给JSON,无论它是否已保存,因此我选择从这个角度开始工作.


And*_*sca 7

服务器端骨干验证:

服务器端

返回错误数组

客户端

调用model.save时,将"wait:true"作为选项传递:

modelVar.save(data,{ // here be options
    wait: true,
    success: this.processRequest,
    error: this.processErrors
});
Run Code Online (Sandbox Code Playgroud)

更新模型的验证函数以检查错误数组:

validate: function(attrs) {
    this.errors = [];
    if (attrs.errors && attrs.errors.length > 0) {
        for (var key in attrs.errors) {
            this.errors.push(attrs.errors[key].errorMessage);
        }
    }
    return _.any(this.errors) ? this.errors : null;
}
Run Code Online (Sandbox Code Playgroud)

结果

如果服务器重新生成[错误],错误回调将运行并且模型不会"更改".

更新:

从版本0.9.10开始,这将不再有效.您应该使用"invalid"事件或使用函数的新options参数model.validate(attributes, options):if (typeof(options.error === 'function')) options.error();


Ale*_*rov 3

或者也许我应该使用 http 状态。目前我选择了 403 状态来指示服务器端的验证错误。有关状态的更多信息可以在这里找到:http ://restpatterns.org/HTTP_Status_Codes

  • 这不应该是 400(错误请求)而不是 403(禁止)吗?我通常看到当用户尝试访问他们无权访问的资源时使用 403。 (10认同)