在我的程序中有一个验证函数,如果出现错误,它将阻止表单提交并显示错误信息,否则它将console.log("Success")
但我的表单即使没有任何错误也无法提交。无论如何在没有错误时启用状态代码200
?因为状态代码400
function validateSignup(data,callback) {
"use strict";
var USER_RE = /^[a-zA-Z0-9_-]{2,25}$/;
var PASS_RE = /^.{6,100}$/;
var EMAIL_RE = /^[\S]+@[\S]+\.[\S]+$/;
if (!USER_RE.test(data.publicUsername)) {
callback(new Error('Invalid Public Username try just letters and numbers, e.g: Ed, 69, Kelvin and etc'), null);
}
if (!PASS_RE.test(data.password)) {
callback(new Error('Password must be at least 6 characters long'), null);
}
if (data.password != data.confirmPassword) {
callback(new Error('Password must match'), null);
}
if (!EMAIL_RE.test(data.email)) {
callback(new Error('Invalid email address'), null);
}
if (data.email != data.confirmEmail) {
callback(new Error('Email must match'), null);
}
return true;
}
handlesignup
this.handleSignup = function(req, res, next) {
"use strict";
validateSignup(req.body, function(error, data) {
if(error) {
res.send(400, error.message);
} else {
console.log("success");
}
})
}
function RegisterCtrl($scope, $http, $location) {
$scope.form = {};
$scope.errorMessage = '';
$scope.submitPost = function() {
$http.post('/register', $scope.form).
success(function(data) {
$location.path('/');
}).error(function(err) {
$scope.errorMessage = err;
});
};
}
答案 0 :(得分:1)
您的代码中存在多个问题。
您的validateSignup
函数并不总是调用其回调函数。如果输入通过了验证,它不应该返回true
,而是调用它的回调而没有错误和数据:
function validateSignup(data,callback) {
// ...
callback(null, data);
}
您并不总是回答客户的要求:
validateSignup(req.body, function(error, data) {
if(error) {
res.send(400, error.message);
} else {
console.log("success");
res.send(200);
}
})
编辑:作为旁注,应该异步调用回调(即使用process.setImmediate
,process.nextTick
或setTimeout
),但这不是在您的特定情况下会出现问题,因为回调将始终同步调用。如 Effective JS 中所述,第67项:
永远不要同步调用异步回调,即使数据立即可用。
这就是为什么我的建议是始终异步调用回调,这将使您免于以后的奇怪错误。有很多原因可以解释为什么你不应该这样做,但最明显的是你可以很容易地把它吹掉。
以下是推迟回调执行的方法:
function validateSignup(data,callback) {
// ...
process.setImmediate(function() {
callback(null, data);
});
}