用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼
為了數(shù)據(jù)庫課設(shè),打算后臺用node搭建,前臺用vue搞個博客出來(因為前段時間在學?。1緛韓ode不想用框架,喜歡先打好基礎(chǔ)的,奈何3個星期要把他做完和應(yīng)付各種考試,所以最后還是用了express,大大簡化我的學習成本。
數(shù)據(jù)庫我選了比較“正式”的MySQL,代碼方面這個比MongoDB復雜一些。而且這是數(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。詳細的就自己學相關(guān)知識了。
- 拿到查詢后的結(jié)果,登錄與注冊要分清楚邏輯,什么時候是成功的什么情況是失敗的。注冊這里我掉坑了。因為名不能重復,所以要先查詢,如果能查到放回的是status=99999。剛開始我沒理解清楚Promise,以為查詢不成功就是走reject(err)其實并不是,查詢不成功返回的是[],執(zhí)行的還是resolve(),區(qū)分就只能看他返回來的status。
- 還有保存登錄狀態(tài),就是session,這里我也沒怎么弄懂。但是這一步可以放在router的中間件執(zhí)行,這樣每個經(jīng)過這個router就能執(zhí)行那一步了。如果存在req.session.user的時候,就把當前的locals.user賦值。
- 導致我注冊那里摔了很久還爬不上來除了沒理解清楚Promise外,還有mysql不能輸入中文。當時我沒有設(shè)utf8,所以一直報錯,走的是reject(err)。不只只把mysql的語言設(shè)置為utf8,還要注意navcicat新建屬性的時候的字符類型,不然字符沖突搞得不能插入語句成功。
最后來個展望未來。
文章頁我打算用jade渲染整個文章html再返回出來。因為文章嘛,要變的其實也不多,而且用vue的話,個人感覺像評論啊這種小組件用比較好,文章都是靜態(tài)的,所以先在后端渲染出來直接返回,還不用再請求一遍再渲染。
想了想進度了能力,除了增刪改查文章,我覺得我的博客也只能有查看和評論文章的功能,不知道vue哪里能用。。??赡芪乙策€沒很好的接觸和理解vue畢竟我才學到vur-router。應(yīng)該大的功能就是做一個簡潔版markdown吧
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 淺析node連接數(shù)據(jù)庫(express+mysql)
- node+express框架中連接使用mysql(經(jīng)驗總結(jié))
- Node.js+Express+Mysql 實現(xiàn)增刪改查
- 初識NodeJS服務(wù)端開發(fā)入門(Express+MySQL)
- node基于express框架操作Mysql數(shù)據(jù)庫的步驟
- Express連接MySQL及數(shù)據(jù)庫連接池技術(shù)實例
- Node.js+Express+Vue+MySQL+axios的項目搭建全過程
- express.js如何做mysql注入與node-mysql中防止SQL注入方法解析
相關(guān)文章
使用Node.js實現(xiàn)一個簡單的FastCGI服務(wù)器實例
這篇文章主要介紹了使用Node.js實現(xiàn)一個簡單的FastCGI服務(wù)器實例,也可以作為一個比較詳細的Node.js服務(wù)器創(chuàng)建教程,需要的朋友可以參考下2014-06-06
nodejs body-parser 解析post數(shù)據(jù)實例
下面小編就為大家?guī)硪黄猲odejs body-parser 解析post數(shù)據(jù)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
package.json與package-lock.json創(chuàng)建及使用詳解
這篇文章主要為大家介紹了package.json與package-lock.json創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

