這篇文章將為大家詳細講解有關(guān)如何使用node和express連接MySQL實現(xiàn)登錄注冊,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的南木林網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
數(shù)據(jù)庫我選了比較“正式”的MySQL,代碼方面這個比MongoDB復(fù)雜一些。而且這是數(shù)據(jù)庫課設(shè),如果用mongodb老師肯定讓我掛了,因為沒有涉及到設(shè)置主鍵、外鍵等。
先在主入口js引入登錄注冊業(yè)務(wù)js和發(fā)起一個監(jiān)聽端口
var express = require('express'); var user = require('./controll/user'); var app = new express(); app.use(express.static('public')); //靜態(tài)資源的入口 app.use('/user',user); //這樣寫是為了以后如果改變了請求路徑,也不用改邏輯js而是改這行的路徑即可 var server = app.listen(3000)
html
$("#signup").click(function(){ $.ajax({ url: "/user/signup", type: 'post', data: $("#formid").serialize(), success: function(data) { if(data.status == 99999) { alert("3秒后跳轉(zhuǎn)到首頁"); setTimeout(function() { location.href='http://'+window.location.host+'/html/index.html'; },3000) }else { alert('登錄名或密碼錯誤') } } }) }) $("#register").click(function(){ $.ajax({ url: "/user/register", type: 'post', data: $("#formRegister").serialize(), success: function(data) { console.log(data); if(data.status == 99999) { alert("注冊成功") }else { alert("登錄名已經(jīng)有人用") } } }) })
user.js
var mysql = require('mysql'); var express = require('express'); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var session = require('cookie-session'); function select(sql) { var promise = new Promise(function(resolve,reject) { var result = null; var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root' }); connection.connect(); connection.query("USE test"); connection.query(sql, function (err, results, fields) { if (err) { console.log("err"); reject(err); }else { console.log("yes"); if(results.length > 0) { resolve({status: 99999}); }else { resolve({status: 00000}); } } } ); connection.end(); }) return promise; } var router = express.Router(); router.use(bodyParser.urlencoded({ extended: true })); router.use(cookieParser()) router.use(session({ secret: 'blog' })) router.use(function timeLog(req,res,next) { var _user = req.session.user; if(_user) { //router.locals.user = user; } next(); }) //登錄 router.post('/signup',function(req, res) { var _user = req.body.user; var name = _user.name; var password = _user.password; select('SELECT * FROM name WHERE name = "'+ name + '" AND password = "' + password + '";').then(function(data) { //session存user name和userid req.session.user = name; data.status > 50 ? data.url = '/html/index.html' : null; res.json(data); res.end(); req.redirect("/"); }).catch(function(err){}) }) //注冊 router.post('/register',function(req, res) { var _user = req.body.user; var name = _user.name; var password = _user.password; console.log(name+" "+password) select('SELECT * FROM name WHERE name = "'+ name + '";') .then(function(data) { if(data.status == 99999) { console.log("已有此用戶名") res.json({status:00000}); res.end(); }else { select('INSERT INTO name(name,password) VALUES ("'+name+'", "'+password+'");') .then(function(data) { res.json({status:99999}); res.end(); }).catch(function(err){}) } }).catch(function(err){ }) }); //退出 router.get("/logout",function(req, res) { delete req.session.user; res.end(); }) //獲取session router.get("/session",function(req, res) { console.log("user in session"); console.log(req.session.user); res.json({user:req.session.user}); res.end(); }) module.exports = router;
代碼很多,不一一解釋了,如果以后有空再補回。先說幾個點
我把連接數(shù)據(jù)庫的邏輯都包在了select方法里。因為最后要把查詢到的結(jié)果返回回去,所以就要return,但是??!查詢數(shù)據(jù)庫是異步操作??!所以直接在select函數(shù)的最后一行return是沒有效果的,所以就算return都要在查完后的那個回掉函數(shù),但是在回掉函數(shù)return 的話是不能return到select函數(shù)外的。解決方案就是es6的Promise。詳細的就自己學(xué)相關(guān)知識了。
拿到查詢后的結(jié)果,登錄與注冊要分清楚邏輯,什么時候是成功的什么情況是失敗的。注冊這里我掉坑了。因為名不能重復(fù),所以要先查詢,如果能查到放回的是status=99999。剛開始我沒理解清楚Promise,以為查詢不成功就是走reject(err)其實并不是,查詢不成功返回的是[],執(zhí)行的還是resolve(),區(qū)分就只能看他返回來的status。
還有保存登錄狀態(tài),就是session,這里我也沒怎么弄懂。但是這一步可以放在router的中間件執(zhí)行,這樣每個經(jīng)過這個router就能執(zhí)行那一步了。如果存在req.session.user的時候,就把當(dāng)前的locals.user賦值。
導(dǎo)致我注冊那里摔了很久還爬不上來除了沒理解清楚Promise外,還有mysql不能輸入中文。當(dāng)時我沒有設(shè)utf8,所以一直報錯,走的是reject(err)。不只只把mysql的語言設(shè)置為utf8,還要注意navcicat新建屬性的時候的字符類型,不然字符沖突搞得不能插入語句成功。
關(guān)于“如何使用node和express連接mysql實現(xiàn)登錄注冊”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
文章題目:如何使用node和express連接mysql實現(xiàn)登錄注冊
文章來源:http://sd-ha.com/article44/jgsjee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站維護、網(wǎng)站內(nèi)鏈、網(wǎng)站營銷、網(wǎng)站制作、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)