可以'不要在express/angular应用程序上提交表格

can't submit a form on express/angular app

本文关键字:应用 angular 应用程序 程序上 表格 提交 express 可以      更新时间:2024-01-08

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

Angular

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

编辑:顺便说一句,回调应该异步调用(即使用process.setImmediateprocess.nextTicksetTimeout),但这在您的特定情况下不是问题,因为回调总是同步调用。如有效JS第67项所述:

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

这就是为什么我的建议是总是异步调用回调,这样以后你就不会出现奇怪的错误。你不应该这样做有很多原因,但最明显的是你可以很容易地破坏堆栈。

以下是如何推迟回调执行:

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