簡體   English   中英

無法在Express / Angular應用上提交表單

[英]can't submit a form on express/angular app

在我的程序中有一個驗證功能,如果有錯誤,它將阻止表單提交並顯示錯誤消息,否則它將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;
    }

處理注冊

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM