如果Angular App正确验证了客户端表单,则为Angular App所需的服务器端错误处理



例如,我有这样的html:

<form novalidate>
    <input type="text" name="name" required />
    <button type="submit" ng-submit="saveThis()"> Save </button>
</form>

我正在使用Angular处理错误required

现在在服务器发布方法上:

router.post('/', function(req, res, next) {
    req.checkBody('name', 'name is required.').notEmpty();
    var errors = req.validationErrors();
    if(errors) {
        //Send these errors to angular
    } else {
        //Code for saving data
    }
}

我的问题是:

我已经在Angular中处理误差。那么对服务器端验证的需求是什么?

如果您说如果在浏览器中禁用JavaScript,则需要服务器端错误。但是,我的表格将永远不会发布,因为我正在使用Angular的ng-submit来发布数据,因为如果禁用JavaScript,Angular也将行不通。

好吧,您可以说,如果我的服务器从另一个应用程序收到请求,那么我认为这是必要的。如果您知道其他例外,请告诉我。但是,让我们回到我的应用程序的范围:

如果有必要将服务器错误发送到我的Angular应用程序,那么您可以帮助我从服务器发送错误消息到Angular,然后在HTML页面上显示它们?

更新:@paqash请求的代码

在我的控制器中:

$scope.submit = function(effect) {
    effectService.save(effect, function(err, result, status) {
        $scope.effect = null;
        if(!(effect == null || effect == undefined)) {
            if(!(effect._id == undefined || effect._id == '')) {
                $scope.currentEffectName = null;                         
                $location.path('/effect');
            }
        }
        $setPristine();
        $setUntouched();
    });
}

和我的服务:

function save(effect, callback) {
    if(effect == undefined || effect._id == undefined || effect._id == '') {
        $http.post('/api/effect', effect);
    } else {
        $http.put('/api/effect/' + effect._id, effect);
    }
}

update2:

这是我的html:

<div class="col-md-10">
    <ul class="errors" ng-if="errors.length > 0">
        <li class="alert alert-danger" ng-repeat="error in errors"> {{error.msg}} </li>
    </ul>
</div>

这是控制器保存功能:

$scope.submit = function(effect) {
    effectService.save(effect, function(err, result, status) {
        if(err) {
            $scope.errors = err;
        }
        else {
            $scope.errors = null;
        }
         ...........
    });
}

这是服务:

function save(effect, callback) {
    if(effect == undefined || effect._id == undefined || effect._id == '') {
        $http.post('/api/effect', effect).then(saveSuccessCallback, saveFailureCallback);
    } else {
        $http.put('/api/effect/' + effect._id, effect).then(saveSuccessCallback, saveFailureCallback);
    }
}
function saveSuccessCallback() {
    //Clear errors
    return true;
}
function saveFailureCallback() {
    //Raise errors
    return false;
}

我已删除了用于检查服务器端验证的所有客户端验证。现在,当我单击"保存"按钮而无需输入输入框中的任何内容时,我没有看到任何错误。

服务器端验证是必要的,是的。您永远无法信任客户。

您可以通过以下方式发送这些错误:

res.status(400).send({errors: errors});

,然后在您的saveThis方法中检查响应的HTTP代码,如果有错误,则显示它们。

编辑:您的$ HTTP方法可以通过成功和错误回调链接,例如:

$http.post('/someUrl', data, config).then(successCallback, errorCallback);

添加了errorcallback方法后,它将在您的状态不是200多点时发射,您可以检查响应对象的状态和错误的数据。

更多信息在这里。

@vishal(op)更新:

这是我从服务传递响应对象的方式:

function save(effect, callback) {
    if(effect == undefined || effect._id == undefined || effect._id == '') {
        $http.post('/api/effect', effect)
             .then(function (response) {
                 //Clear errors
                 callback(response);
             }, function(response) {
                 //Raise errors
                 callback(response);
             });
    } else {
        ............
    }
}

然后在控制器中:

$scope.submit = function(effect) {
    effectService.save(effect, function(response) {
        console.log(response);
        if(response.status == 400) {
            $scope.errors = response.data.errors;
        }
        else {
            $scope.errors = null;
        }
        ...........
    });
}

永远不要隐式信任您从客户端获得的任何东西。

这很重要,所以我要重复...

永远不要隐含地信任您从客户端获得的任何东西。


好吧,现在那已经遥不可及...这个问题的答案确实取决于您。问问自己:

如果我的服务器端代码在未验证的表单数据上运行,这是一件坏事吗?

如果不好,则您的服务器端代码需要保护自己免受这种情况的影响。也许很少会发生,也许它将永远不会发生。如果是这样,认为自己很幸运。但是它可以发生,所以编写代码来处理这种情况。

如果还不错,如果系统可以继续良好,并且如果有人提交未验证的数据,那么实际上没有什么问题,那么您可能不需要验证它。

基本上,您将两个截然不同的问题融合在一起。一个是:

我是否应该为服务器端验证作为一般练习吗?

答案是响亮的。另一个是:

在我的特殊情况下,真的有必要吗?

的答案确实取决于您和逻辑/需求/等。您正在构建的系统。当然,在某些情况下,"验证"完全是出于改善用户体验的目的,而在没有完成时,没有什么能真正"出错"。(例如,提交空表格的用户可能只会创建一个空记录。在结构上有效,无用。现在,用户成功拥有空记录,没什么大不了的。)无论是这样的情况,都取决于您。

最新更新