不能在快递/角度应用程序上提交表单

时间:2013-11-29 13:55:11

标签: javascript node.js angularjs express

在我的程序中有一个验证函数,如果出现错误,它将阻止表单提交并显示错误信息,否则它将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;
      });
  };
}

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题。

  1. 您的validateSignup函数并不总是调用其回调函数。如果输入通过了验证,它不应该返回true,而是调用它的回调而没有错误和数据:

    function validateSignup(data,callback) {
      // ...
      callback(null, data);
    }
    
  2. 您并不总是回答客户的要求:

    validateSignup(req.body, function(error, data) {
       if(error) {
           res.send(400, error.message);
       } else {
           console.log("success");
           res.send(200);
       }
    })
    
  3. 编辑:作为旁注,应该异步调用回调(即使用process.setImmediateprocess.nextTicksetTimeout),但这不是在您的特定情况下会出现问题,因为回调将始终同步调用。如 Effective JS 中所述,第67项:

      

    永远不要同步调用异步回调,即使数据立即可用。

    这就是为什么我的建议是始终异步调用回调,这将使您免于以后的奇怪错误。有很多原因可以解释为什么你不应该这样做,但最明显的是你可以很容易地把它吹掉。

    以下是推迟回调执行的方法:

    function validateSignup(data,callback) {
      // ...
      process.setImmediate(function() {
        callback(null, data);
      });
    }