Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果Angular应用正确验证客户端表单,Angular应用是否需要服务器端错误处理?_Javascript_Angularjs_Node.js_Mean Stack - Fatal编程技术网

Javascript 如果Angular应用正确验证客户端表单,Angular应用是否需要服务器端错误处理?

Javascript 如果Angular应用正确验证客户端表单,Angular应用是否需要服务器端错误处理?,javascript,angularjs,node.js,mean-stack,Javascript,Angularjs,Node.js,Mean Stack,例如,我有如下HTML: <form novalidate> <input type="text" name="name" required /> <button type="submit" ng-submit="saveThis()"> Save </button> </form> $http.post('/someUrl', data, config).then(successCallback, errorCall

例如,我有如下HTML:

<form novalidate>
    <input type="text" name="name" required />
    <button type="submit" ng-submit="saveThis()"> Save </button>
</form>
$http.post('/someUrl', data, config).then(successCallback, errorCallback);
我的问题是:

我已经在处理角度误差了。那么,需要进行服务器端验证吗

如果您说如果浏览器中禁用了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();

    });
}
$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;
        }

        ...........

    });

}
在我的服务中:

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);
    }
}
更新2:

这是我的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>
以下是服务:

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方法可以与成功和错误回调链接,如下所示:

<form novalidate>
    <input type="text" name="name" required />
    <button type="submit" ng-submit="saveThis()"> Save </button>
</form>
$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(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();

    });
}
$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;
        }

        ...........

    });

}
永远不要含蓄地相信你从客户那里得到的任何东西

这很重要,所以我要重复一遍

永远不要含蓄地相信你从客户那里得到的任何东西


好吧,现在这已经不碍事了。。。这个问题的答案真的取决于你。问问自己:

如果我的服务器端代码对未验证的表单数据进行操作,这是一件坏事吗

如果是坏的,那么服务器端代码需要保护自己不受这种情况的影响。也许它很少会发生,也许它永远不会发生。如果是这样的话,想想你自己是幸运的。但这是可能发生的,所以请编写代码来处理这种情况

如果还不错,如果系统可以正常运行,并且如果有人提交了未经验证的数据,那么您可能不需要验证它

基本上,你把两个完全不同的问题混合在一起。一是:

我是否应该将服务器端验证作为一种常规做法

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

就我而言,这真的有必要吗


答案真的取决于你和你正在构建的系统的逻辑/需求/等等。当然,在某些情况下,“验证”完全是为了改善用户体验,如果不这样做,任何事情都不会真正“出错”。(例如,提交空表单的用户可能只是创建了一个空记录。结构上有效,但没有用处。用户现在成功地拥有了一个空记录,这没什么大不了的。)是否出现这种情况取决于您的设计。

。在一个分离得很好的应用程序中,您的前端可能会调用一个服务,这样您就可以在不同的消费应用程序之间共享您的服务调用。在这种情况下,您应该至少在服务器端强制执行业务逻辑,以确保不会发出无效请求。此外,如果不在业务逻辑服务器端验证业务逻辑,那么对服务器代码进行单元测试将导致所有业务逻辑测试失败。您的数据可能在您的站点上进行了验证,但有人可能会在浏览器外将数据发送到您的服务并损坏您的数据。在我看来,始终检查服务器上的数据,并添加客户端验证,以避免对服务器进行不必要的调用。此外,一般来说,我让UI担心输入验证,并根据需要添加任何业务规则,即:如果选择了B,则不能选择A等。。然后在调用服务器端时,我确保服务器代码能够独立运行,确保给定操作的所有业务逻辑都得到验证。是的,您可以抛出违规(特定于业务逻辑的错误)并将违规代码返回给前端,前端可以使用查找获取要显示的消息。@Fran感谢您的建议。“我会记在心里的。”波特波西,你用几句话向我解释了整个概念。谢谢你的评论。谢谢你@david。我会记住这一点,每当我感到困惑时,我都会看看这个答案。目前,我已经决定在服务器上也进行验证。所以,我将投票表决你的答案,然后进入下一个。再次感谢。谢谢你试着帮助我。你能举个例子吗?举个什么的例子吗?举个检查响应的http代码的例子。我已经用请求的代码更新了我的问题。你能检查有问题的更新部分吗?我已经按照你的建议尝试使用成功和错误回调。但我仍然没有收到任何错误消息。你能看一下问题的更新2部分吗?