1. 程式人生 > >用node和express連線mysql實現登入註冊

用node和express連線mysql實現登入註冊

為了資料庫課設,打算後臺用node搭建,前臺用vue搞個部落格出來(因為前段時間在學啊)。本來node不想用框架,喜歡先打好基礎的,奈何3個星期要把他做完和應付各種考試,所以最後還是用了express,大大簡化我的學習成本。

資料庫我選了比較“正式”的mysql,程式碼方面這個比mongodb複雜一些。而且這是資料庫課設,如果用mongodb老師肯定讓我掛了,因為沒有涉及到設定主鍵、外來鍵等。

先在主入口js引入登入註冊業務js和發起一個監聽埠

var express = require('express');
var user = require('./controll/user');   

var
app = new express(); app.use(express.static('public')); //靜態資源的入口 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秒後跳轉到首頁"); 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("登入名已經有人用") } } }) })

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;

程式碼很多,不一一解釋了,如果以後有空再補回。先說幾個點

  • 我把連線資料庫的邏輯都包在了select方法裡。因為最後要把查詢到的結果返回回去,所以就要return,但是!!查詢資料庫是非同步操作!!所以直接在select函式的最後一行return是沒有效果的,所以就算return都要在查完後的那個回掉函式,但是在回掉函式return 的話是不能return到select函式外的。解決方案就是es6的Promise。詳細的就自己學相關知識了。
  • 拿到查詢後的結果,登入與註冊要分清楚邏輯,什麼時候是成功的什麼情況是失敗的。註冊這裡我掉坑了。因為名不能重複,所以要先查詢,如果能查到放回的是status=99999。剛開始我沒理解清楚Promise,以為查詢不成功就是走reject(err)其實並不是,查詢不成功返回的是[],執行的還是resolve(),區分就只能看他返回來的status
  • 還有儲存登入狀態,就是session,這裡我也沒怎麼弄懂。但是這一步可以放在router的中介軟體執行,這樣每個經過這個router就能執行那一步了。如果存在req.session.user的時候,就把當前的locals.user賦值。
  • 導致我註冊那裡摔了很久還爬不上來除了沒理解清楚Promise外,還有mysql不能輸入中文。當時我沒有設utf8,所以一直報錯,走的是reject(err)。不只只把mysql的語言設定為utf8,還要注意navcicat新建屬性的時候的字元型別,不然字元衝突搞得不能插入語句成功。

最後來個展望未來。
文章頁我打算用jade渲染整個文章html再返回出來。因為文章嘛,要變的其實也不多,而且用vue的話,個人感覺像評論啊這種小元件用比較好,文章都是靜態的,所以先在後端渲染出來直接返回,還不用再請求一遍再渲染。
想了想進度了能力,除了增刪改查文章,我覺得我的部落格也只能有檢視和評論文章的功能,不知道vue哪裡能用。。。可能我也還沒很好的接觸和理解vue畢竟我才學到vur-router。應該大的功能就是做一個簡潔版markdown吧

還有兩個星期要交這課設和2個java web的小組作業,接下來3周還有4門考試,加油吧美少女~~