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-03
Node.js API詳解之 dgram模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 dgram模塊用法,結(jié)合實(shí)例形式分析了Node.js API中dgram模塊基本功能、函數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-06-06
node.js 基于 STMP 協(xié)議和 EWS 協(xié)議發(fā)送郵件
這篇文章主要介紹了node.js 基于 STMP 協(xié)議和 EWS 協(xié)議發(fā)送郵件的示例,幫助大家更好的理解和使用node.js,感興趣的朋友可以了解下2021-02-02
nodejs轉(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-05
Node.js?中的?module.exports?與?exports區(qū)別介紹
這篇文章主要介紹了Node.js中的module.exports與exports區(qū)別介紹,每個(gè)模塊中都有module對(duì)象,存放了當(dāng)前模塊相關(guān)的信息,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09
Node.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

