天天看點

asp.net接受表單驗證格式後再送出資料_建立一個注冊界面,并記錄到資料庫中...

demo開始時我們需要準備點東西

1.jQuery 可以去cdn.js上copy一個,

2.我們要安裝好node.js, 因為需要自己搭建一個伺服器去測試,32位,64位,下載下傳後配置好就行

3.開始寫代碼吧:

首先我們需要3個input框,分别對應郵箱(使用者名),密碼,确定密碼,然後需要一個submit按鈕,可以使用input做也可以使用button(在預設情況下,如果該網頁隻有一個按鈕的情況下,自動生成submit按鈕),下面時html的代碼:

<
           
asp.net接受表單驗證格式後再送出資料_建立一個注冊界面,并記錄到資料庫中...

很直的的3個框框,連名字都沒有都不知道是做什麼的,醜的一批,給它加點樣式,css:

.signUp{
 display: flex;
 flex-direction: column;
 height: 100vh;
 justify-content: center;
 align-items: center;
}

#sign>input{
 display: block;
}
           
asp.net接受表單驗證格式後再送出資料_建立一個注冊界面,并記錄到資料庫中...

OK差不多了,反正也是測試,字型就不調的完全對齊了,現在我們可以一眼看到這是幹啥的啦,下面我們開始用jQuery寫我們在點選按鈕後要送出的資訊:

思路大緻是這樣的,首先我們要監聽使用者點選送出按鈕,送出後用AJAX送出請求,然後傳回給我們一個隐藏的then方法(Promise),then接受兩個函數分别對應伺服器傳回的結果,成功函數在前,失敗函數再後,然後對成功和失敗分别作出判斷後,把資訊輸出給使用者就完成了。以代碼的形式來展示:

$('#sign').on('submit', (e) => {   //這裡一定要注意,監聽的一定要是form表單的送出事件,為什麼不是click事件呢?因為使用者送出不一定非要用滑鼠點選呀。
            e.preventDefault();  //因為form預設送出會跳轉頁面,是以這裡是取消它的預設設定,a标簽一樣适用

//這一連串的操作是為了拿到各個input的name的值,(做了一個循環這樣不用我們一個一個寫了),然後把它們按照key:value的形式存在這個空對象中
 var hash = {};  
 let need = ['emall', 'password', 'confirm_password'];
            need.forEach((name) => {
 let value = $('#sign').find(`[name=${name}]`).val();
                hash[name] = value;
            })

//這裡的判斷是如果使用者沒有輸入油箱就彈窗提示,這裡也可以不判斷,因為後端一定會判斷的。不過了不多發一次請求就地截殺了
 if(hash.emall === ''){
 alert('請輸入郵箱')
 return
            }

//下面是用jQuery發送post請求,然後成功怎麼樣,失敗怎麼怎麼樣,ok 我們浏覽器的JS寫完了,
            $.post('/signUp', hash).then((response) => {
 console.log('1')
            }, (request) => {
 let { errors } = request.responseJSON;
 if (errors.emall && errors.emall === 'invalid') {
 alert('郵箱錯了')
                }
            })
        });
           

下面開始來寫伺服器的代碼,和上篇文章一樣,用同樣簡陋的伺服器代碼:

我們需要先登上這台伺服器,是以先定一個GET請求把,去請求剛才寫的網站的HTML吧,

if (path === '/signUp' && method === 'GET') {   
 var string = fs.readFileSync('./sign-up.html', 'utf8')
 response.statusCode = 200
 response.setHeader('Content-Type', 'text/html;charset=utf-8')
 response.write(string)
 response.end()
}
           

好了我們拿到了這個網站的html(就是我們浏覽器上看到的樣子),我們需要在使用者送出後可以做出響應是以我們還需要一個路由

這裡我先定了一個函數為了可以拿到我們請求的第4部分,也就是使用者輸入的資訊,
用Promise傳回資料。因為使用者請求的資訊并不是一個整體(不是同時産生的)
,是以要把資料(使用者送出的資訊)一片一片放在body這個數組中,并把它轉化成字元串,再傳回出去友善後續處理。
function requestBody(request) {
  return new Promise((reslove, reject) => {
    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      reslove(body)
    });
  })
}
           

好我們建立路由,去處理這些請求體并傳回給前端資訊把:

else if (path === '/signUp' && method === 'POST') {
 requestBody(request).then((body) => {   //成功拿到請求結果後(上面函數的body)
 let hash = {};
 let strings = body.split('&');   //用字元串的API split 讓它在'&'時就分割開來,組成一個新的數組例如[123&597,abc&ffa] 轉化成[123,597,abo,ffa]
 strings.forEach((string) => {   //周遊這個數組
 let part = string.split('=');  //讓它分割成一段一段的,然後用=号切割它 得到一個新的數組part
 let key = part[0];   // = 前面的資料
 let value = part[1]; //= 後面的資料
 hash[key] = value;  //将他們依次放入上面的空對象中
      })
//循環結束後我們拿到一個我們想要的對象hash
 let { emall, password, confirm_password } = hash  這裡用到ES6文法  let emall = hash.emall  ...依次指派
 emall = decodeURIComponent(emall)   //這裡是為了讓@能在伺服器上顯示,不然我們是取不到@符号的
 if (emall.indexOf('@') === -1) {   //用@符号判斷使用者是否輸入的郵箱
 response.statusCode = 400;
 response.setHeader('Content-Type', 'application/json;charset=utf-8')
 response.write(`
        {"errors":{"emall":"invalid"}}
      `);
      } else if (password !== confirm_password) {
 response.statusCode = 400
 response.write('密碼不一緻');
      } else {
 let db = fs.readFileSync('./db', 'utf8');   建立一個資料庫(檔案),這裡使用的是JSON的空數組(string),一定要記得我們存在資料庫的值都是string;
要用時把它轉化成别的格式,再來使用
 try {
 db = JSON.parse(db)    
        } catch (exit) {         //try catch()  意思是試圖去将字元串轉成一個JSON對象,如果錯誤,就重置這個資料庫
 db = []
        }


//下面是判斷資料庫有不有這個資訊,如果有就提示前端這個使用者名已經建立,
 var inUse = false;
 for (var i = 0; i < db.length; i++) {
 let personal = db[i];
 if (personal.emall === emall) {
 inUse = true
 break;
          }
        }
 if (inUse) {
 response.statusCode = 400
 response.setHeader('Content-Type', 'application/json;charset=utf-8')
 response.write(`
        {"errors":{"emall":"invalid"}}
      `);

//如果全部成功,郵箱,密碼,都對并且沒有被注冊,就成功了,然後把資料轉成string記錄到我們的db檔案(簡單的資料庫)中。
        } else {
 response.statusCode = 200
 db.push({ emall: emall, password: password });
 var dbstring = JSON.stringify(db)
 fs.writeFileSync('./db', dbstring)
        }
      }
 response.end()

    })
  }
           

繼續閱讀