从Angular $资源访问实际的服务器响应

时间:2014-05-05 00:08:11

标签: javascript angularjs laravel

我在Laravel中内置了一个API,它以如下格式返回JSON:

{
  "data":{
    "errors":{
      "username":"The username has already been taken.",
      "email":"The email has already been taken."
    }
  },
  "success":true,
  "status":400
}

在这种情况下,我尝试使用已存在的用户名和电子邮件地址创建用户。这是我在我的控制器中使用的Angular $资源代码:

var user = new User({
    username: $scope.user.username,
    email: $scope.user.email,
    password: $scope.user.password
});

var response = user.$save(function(data) {
    console.log(data);
}, function(data) {
    if (data.status === 400) {
        angular.forEach(data.data.data.errors, function(error) {
            console.log(error);
        });
    }
});

所以这样做是在API上向/users发送POST请求,如果它返回非200状态代码,则检查它是否是400代码表示验证错误,并console.log表示这些错误消息。果然,我将错误消息输出到控制台。

我想知道的是,是否有比data.data.data.errors更好的方式来访问错误消息。看到API将响应数据包装在data字段中,并且Angular返回请求的$resource而不是实际的服务器响应,这会导致使用相当难看的数量的属性来获取错误消息。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我认为简短的回答是'不'。但是,如果是我,我可能会改变一些变量以使事情变得更好。

user.$save(function(data) {
    console.log(data);
}, function(response) {
    if (response.status === 400) {
        var data = response.data.data
        angular.forEach(data.errors, function(error) {
            console.log(error);
        });
    }
});

如果我控制了api,我就不会将errors包装在冗余的第三级data对象中。这给了一个完全可以接受的代码imo。

{
  "errors":{
    "username":"The username has already been taken.",
    "email":"The email has already been taken."
  },
  "success":true,
  "status":400
}

user.$save(function(data) {
    console.log(data);
}, function(response) {
    var data = response.data
    if (data.status === 400) {
        angular.forEach(data.errors, function(error) {
            console.log(error);
        });
    }
});