例如,我有这样的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;
}
...........
});
}
永远不要隐式信任您从客户端获得的任何东西。
这很重要,所以我要重复...
永远不要隐含地信任您从客户端获得的任何东西。
好吧,现在那已经遥不可及...这个问题的答案确实取决于您。问问自己:
如果我的服务器端代码在未验证的表单数据上运行,这是一件坏事吗?
如果不好,则您的服务器端代码需要保护自己免受这种情况的影响。也许很少会发生,也许它将永远不会发生。如果是这样,认为自己很幸运。但是它可以发生,所以编写代码来处理这种情况。
如果还不错,如果系统可以继续良好,并且如果有人提交未验证的数据,那么实际上没有什么问题,那么您可能不需要验证它。
基本上,您将两个截然不同的问题融合在一起。一个是:
我是否应该为服务器端验证作为一般练习吗?
答案是响亮的是。另一个是:
在我的特殊情况下,真的有必要吗?
的答案确实取决于您和逻辑/需求/等。您正在构建的系统。当然,在某些情况下,"验证"完全是出于改善用户体验的目的,而在没有完成时,没有什么能真正"出错"。(例如,提交空表格的用户可能只会创建一个空记录。在结构上有效,无用。现在,用户成功拥有空记录,没什么大不了的。)无论是这样的情况,都取决于您。