Javascript 如果Angular应用正确验证客户端表单,Angular应用是否需要服务器端错误处理?
例如,我有如下HTML: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
<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部分吗?