Nodejs實(shí)現(xiàn)用戶注冊(cè)功能
1創(chuàng)建連接池對(duì)象
2導(dǎo)出連接池對(duì)象
/** * 1.引入mysql模塊 * 2.創(chuàng)建連接池對(duì)象 * 3.導(dǎo)出連接池對(duì)象 */ const mysql = require('mysql'); var pool = mysql.createPool({ host:'localhost', port:'3306', user:'xxx', password:'xxx', database:'xxx', connectionLimit:20 }); module.exports = pool;
1托管靜態(tài)資源到public
2使用body-parser中間件
3使用路由器掛在到指定的位置
//引入express模塊 const express = require('express'); //引入路由器 const userRouter = require('./routes/user.js'); const productRouter = require('./routes/product.js'); const myproRouter = require('./routes/mypro.js'); const demoRouter = require('./routes/demo.js'); const bodyParser = require('body-parser'); //創(chuàng)建web服務(wù)器 var server = express(); //監(jiān)聽(tīng)端口 server.listen(8080); //托管靜態(tài)資源 server.use(express.static('public')); server.use(express.static('ajaxdemo')); server.use(express.static('mypro')); server.use(express.static('js')); server.use(express.static('css')); server.use(express.static('bootstrap')); server.use(express.static('img')); //使用body-parser中間件 server.use(bodyParser.urlencoded({ extended:false })); //掛載路由器 server.use('/user',userRouter); server.use('/demo',demoRouter);
1引入連接池模塊
2創(chuàng)建路由器對(duì)象
3往路由器中添加路由
4在路由中使用連接池
5導(dǎo)出路由器
/* 1.引入express 2.創(chuàng)建路由器對(duì)象 3.添加路由 4.導(dǎo)出路由器 5.引入連接池對(duì)象 6.將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中 */ const express = require('express'); const pool = require('../pool.js'); var router = express.Router(); //查看所有數(shù)據(jù) router.get('/sele', (req, res) => { //驗(yàn)證數(shù)據(jù)是否為空 var obj = req.query; //console.log('query',obj); for(var key in obj) { if(!obj[key]) { res.send('數(shù)據(jù)不能為空'); return; } } var sqlselect = 'select * from xxx'; pool.query(sqlselect,(err, result) => { if(err) throw err; if(result.length > 0) { res.send(result); } }); }); //查看用戶名 router.get('/seleUname', (req, res) => { //驗(yàn)證數(shù)據(jù)是否為空 var obj = req.query; //console.log('query',obj); for(var key in obj) { if(!obj[key]) { res.send('數(shù)據(jù)不能為空'); return; } } var sqlselect = 'select uname from xxx where uname = ?'; pool.query(sqlselect,[obj.uname],(err,result) => { if(err) throw err; if(result.length > 0) { console.log(result.tength); res.send('1'); }else{ res.send('0'); } }); }); router.post('/reg', (req, res) => { var obj = req.body; console.log('body',obj); for(var key in obj){ if(!obj[key]){ res.send('內(nèi)容不能為空'); return; } } var selectInsert = 'insert into xxx set ?'; pool.query(selectInsert, [obj], (err, result) => { if(err) throw err; if(result.affectedRows > 0) { console.log(result.affectedRows) res.send('1'); } else { res.send('0'); console.log(result.affectedRows) } }); }); //導(dǎo)出路由器 module.exports = router;
4.html頁(yè)面
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <!--<link rel="stylesheet" type="text/css" href="/code.css" />--> <script src="/reg.js" type="text/javascript" charset="utf-8"></script> <script src="/jquery.min.js" type="text/javascript" charset="utf-8"></script> <script src="/bootstrap.min.js" type="text/javascript" charset="utf-8"></script> <link rel="stylesheet" type="text/css" href="/bootstrap.css" /> <style type="text/css"> *{ margin: 0; padding: 0; } body{ background: url(/true.png) no-repeat; background-size: cover; overflow-x: hidden; overflow-y: hidden; } #box{ width: 700px; height: 500px; left: 50%; top: 50%; margin-left: -350px; margin-top: -250px; position: absolute; } </style> </head> <body> <div id="box"> <div class="container"> <div class="row clearfix"> <div class="col-md-10 column"> <form class="form-horizontal" role="form"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">UserName:</label> <div id="uname_box" class="col-sm-6"> <input id="uname" name="uname" type="text" class="form-control" placeholder="Please enter a user name" /> </div> <div id="p1"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">UserPassword:</label> <div class="col-sm-6"> <input id="upwd" name='upwd' type="password" class="form-control" placeholder="Please enter your user password"/> </div> <div id="p2"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">ConfirmPassword:</label> <div class="col-sm-6"> <input id="upwd1" name='upwd' type="password" class="form-control" placeholder="Confirm user password"/> </div> <div id="p3"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">Email:</label> <div class="col-sm-6"> <input id="email" name="email" type="text" class="form-control" placeholder="Please enter user email"/> </div> <div id="p4"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">Tel:</label> <div class="col-sm-6"> <input id="phone" name="phone" type="text" class="form-control" placeholder="Please enter the user's mobile phone number"/> </div> <div id="p5"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-8"> <button id="reg" type="submit" class="btn col-lg-9 btn-info">Register</button> </div> </div> </form> </div> </div> </div> </div> </body> </html>
5.js前端驗(yàn)證以及Ajax異步交互實(shí)現(xiàn)用戶注冊(cè)
window.onload = function() { uname.onfocus = notNull; uname.onblur = notNull; upwd.onfocus = notNull; upwd.onblur = notNull; upwd1.onfocus = notNull; upwd1.onblur = notNull; email.onfocus = notNull; email.onblur = notNull; phone.onfocus = notNull; phone.onblur = notNull; upwd.onfocus = passw; upwd.onblur = passw; upwd1.onfocus = passw; upwd1.onblur = passw; //聲明一個(gè)全局的xhr var xhr = new XMLHttpRequest(); var flag = true; //驗(yàn)證是否為空并且用戶名是否已經(jīng)存在 function notNull() { if(!uname.value) { p1.innerHTML = '用戶名不能為空'; return; } else { p1.innerHTML = ''; getUname(); } if(!upwd.value) { p2.innerHTML = '密碼不能為空'; return; } else { p2.innerHTML = ''; } if(!upwd1.value) { p3.innerHTML = '確認(rèn)密碼不能為空'; return; } else { p3.innerHTML = ''; } if(!email.value) { p4.innerHTML = '郵箱不能為空'; return; } else { p4.innerHTML = ''; } if(!phone.value) { p5.innerHTML = '手機(jī)號(hào)不能為空'; return; } else { p5.innerHTML = ''; } } //驗(yàn)證用戶名是否已存在 function getUname() { xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; console.log(result); if(result === '1') { p1.innerHTML = '用戶名已存在'; //如果用戶名已存在,該按鈕處于禁用狀態(tài) reg.setAttribute('disabled','true'); } else { p1.innerHTML = ''; reg.disabled = false; } } } var url = "/demo/seleUname?uname=" + uname.value; xhr.open('get', url, true); xhr.send(null); } //密碼驗(yàn)證 function passw() { if(upwd.value != upwd1.value) { p3.innerHTML = '兩次密碼不一致'; } } reg.onclick = function() { //查詢所有用戶信息 xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; console.log(JSON.parse(result)); } } var url = "/demo/sele"; xhr.open('get', url, true); xhr.send(null); //執(zhí)行注冊(cè) xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; if(flag) { getUname(); if(result === '1') { alert('success'); setTimeout(()=>{ location.href = 'http://localhost:8080/login_user.html'; }); } else { alert('error'); } } } } var str = "/demo/reg"; xhr.open('post', str, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); var formdata = "uname=" + uname.value + "&upwd=" + upwd.value + "&email=" + email.value + ""; xhr.send(formdata); } }
界面展示:
總結(jié)
以上所述是小編給大家介紹的Nodejs實(shí)現(xiàn)用戶注冊(cè)功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- js簡(jiǎn)單實(shí)現(xiàn)用戶注冊(cè)信息的校驗(yàn)代碼
- 用戶注冊(cè)常用javascript代碼
- JS實(shí)現(xiàn)用戶注冊(cè)時(shí)獲取短信驗(yàn)證碼和倒計(jì)時(shí)功能
- php用戶注冊(cè)頁(yè)面利用js進(jìn)行表單驗(yàn)證具體實(shí)例
- 用于判斷用戶注冊(cè)時(shí),密碼強(qiáng)度的JS代碼
- 在jsp中用bean和servlet聯(lián)合實(shí)現(xiàn)用戶注冊(cè)、登錄
- javascript用戶注冊(cè)提示效果的簡(jiǎn)單實(shí)例
- 快速搭建Node.js(Express)用戶注冊(cè)、登錄以及授權(quán)的方法
- js實(shí)現(xiàn)用戶注冊(cè)協(xié)議倒計(jì)時(shí)的方法
- js實(shí)現(xiàn)登陸與注冊(cè)功能
相關(guān)文章
Node.js操作Firebird數(shù)據(jù)庫(kù)教程
這篇文章主要為大家分享了Node.js操作Firebird數(shù)據(jù)庫(kù)教程,思路清晰便于大家理解,感興趣的小伙伴們可以參考一下2016-03-03Node.js API詳解之 dgram模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 dgram模塊用法,結(jié)合實(shí)例形式分析了Node.js API中dgram模塊基本功能、函數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-06-06node.js 基于 STMP 協(xié)議和 EWS 協(xié)議發(fā)送郵件
這篇文章主要介紹了node.js 基于 STMP 協(xié)議和 EWS 協(xié)議發(fā)送郵件的示例,幫助大家更好的理解和使用node.js,感興趣的朋友可以了解下2021-02-02nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語(yǔ)音插件開(kāi)發(fā))
FFmpeg是一套開(kāi)源的音視頻處理工具,通俗地講,可以對(duì)音視頻文件進(jìn)行剪切、拼接、水印、轉(zhuǎn)碼等處理,這篇文章主要介紹了nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語(yǔ)音插件開(kāi)發(fā)),需要的朋友可以參考下2023-05-05Node.js?中的?module.exports?與?exports區(qū)別介紹
這篇文章主要介紹了Node.js中的module.exports與exports區(qū)別介紹,每個(gè)模塊中都有module對(duì)象,存放了當(dāng)前模塊相關(guān)的信息,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09Node.js使用bcrypt-pbkdf實(shí)現(xiàn)密碼加密
在這個(gè)數(shù)字時(shí)代,保護(hù)用戶密碼的重要性不言而喻,作為一名資深的前端開(kāi)發(fā)工程師和技術(shù)博客作者,今天我將帶你詳細(xì)了解如何在 Node.js 環(huán)境中利用 bcrypt-pbkdf 模塊進(jìn)行密碼的哈希處理,確保你的應(yīng)用安全性得到有效提升,需要的朋友可以參考下2024-05-05在node環(huán)境下parse Smarty模板的使用示例代碼
這篇文章主要介紹了在node環(huán)境下parse Smarty模板的使用示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11