mysql+Express開(kāi)發(fā)小記:完成用戶注冊(cè)和登錄

1.安裝

1.1安裝mysql對(duì)應(yīng)的驅(qū)動(dòng)碉克,

npm install mysql

1.2安裝第三方插件express-connection

 npm install express-connection

2.配置數(shù)據(jù)庫(kù),在models下新建DBConfig.js

代碼:

module.exports = {
    mysql: {
        host: '222.31.81.214',
        user: 'XXX',
        password: 'XXX',
        database: 'big_data_service', // 前面建的user表位于這個(gè)數(shù)據(jù)庫(kù)中 
        port: 3306,
        charset:"utf8"
    }
};

3.在userinfo.js中使用數(shù)據(jù)庫(kù)

// 導(dǎo)入MySQL模塊
var crypto = require('crypto');//使用加密
var mysql = require('mysql');
var dbConfig = require('../models/DBConfig');

4.使用連接池

pool.getConnection(function(err, connection) {
  // Use the connection
  connection.query( 'SELECT something FROM sometable', function(err, rows) {
    // And done with the connection.
    connection.release();

    // Don't use the connection here, it has been returned to the pool.
  });
});

關(guān)閉連接池:

pool.end(function (err) {
  // all connections in the pool have ended
});

5.使用session

在app.js中配置

var session = require('express-session');
//使用session
//這里傳入了一個(gè)密鑰加session id
//使用靠就這個(gè)中間件
app.use(session({ secret: 'wilson'}));

6.userinfo.js 功能塊完整代碼

var express = require('express');
var router = express.Router();
// 導(dǎo)入MySQL模塊
var crypto = require('crypto');
var mysql = require('mysql');
var dbConfig = require('../models/DBConfig');

/* GET users listing. */
//注冊(cè)
var pool = mysql.createPool(dbConfig.mysql);
router.get('/reg', function(req, res, next) {
    res.render('register', {
        title: 'rester',
        success: req.flash('success').toString() || '',
        error: req.flash('error').toString() || '',
        username: req.session.username
    });
})
router.post('/reg', function(req, res, next) {
    //req.body 處理 post 請(qǐng)求
    var username = req.body.username,
        password = req.body.password,
        email = req.body.email,
        passwordRepeat = req.body.passwordRepeat;
    if (password != passwordRepeat) {
        console.log('兩次輸入的密碼不一致!');
        req.flash('error', "兩次輸入的密碼不一致");
        return res.redirect('/userinfo/reg');

    }
    //對(duì)密碼加密
    var md5 = crypto.createHash('md5'),
        md5password = md5.update(password).digest('hex');

    var promise = new Promise(function(resolve, reject) {
        pool.getConnection(function(err, connection) {
            if (err) {
                reject(err);
            } else {
                connection.query('SELECT * FROM userinfo WHERE username = ?', [username],
                    function(err, rows, fields) {
                        if (err) {
                            reject(err);
                        } else {
                            resolve(rows);
                        }
                        connection.release();
                    });
            }
        });
    });

    promise.then(function(rows1) {
        console.log('查找user執(zhí)行成功');
        pool.getConnection(function(err, connection) {
            if (err) {
                console.log(err);
            } else {
                if (rows1.length > 0) {
                    console.log('rows' + rows1);
                    console.log('用戶名已經(jīng)存在');
                    req.flash('error', "用戶名已經(jīng)存在");
                    return res.redirect('/userinfo/reg');

                } else {
                    connection.query('INSERT INTO userinfo(username,password,email) VALUES(?,?,?)', [username, md5password, email],
                        function(err, rows2, fields) {
                            if (err) {
                                console.log(err);
                            } else {
                                req.flash('success', "注冊(cè)成功较性!");
                                delete password;
                                req.session.username = username;

                                return res.redirect('/');

                            }
                            connection.release();
                        });

                }

            }
        });
    }, function(err) {
        console.log(err);
    });


});
//登錄
router.get('/login', function(req, res, next) {
    res.render('login', {
        title: 'login',
        success: req.flash('success').toString() || '',
        error: req.flash('error').toString() || '',
        username: req.session.username
    });
})

router.post('/login', function(req, res, next) {
    var username = req.body.username,
        password = req.body.password;
    var md5 = crypto.createHash('md5'),
        md5password = md5.update(password).digest('hex');
    var promise = new Promise(function(resolve, reject) {
        pool.getConnection(function(err, connection) {
            if (err) {
                reject(err);
            } else {
                connection.query('SELECT * FROM userinfo WHERE username = ? AND password=?', [username, md5password],
                    function(err, rows, fields) {
                        if (err) {
                            reject(err);
                        } else {
                            resolve(rows);
                        }
                        connection.release();
                    });
            }
        });
    });

    promise.then(function(rows1) {
        console.log('查找user執(zhí)行成功');
        pool.getConnection(function(err, connection) {
            if (err) {
                console.log(err);
            } else {
                if (rows1.length > 0) {
                    console.log('rows 登錄成功' + rows1);

                    req.flash('success', "登錄成功!");
                    req.session.username = username;
                    delete password;
                    console.log('sessiom' + req.session.username);

                    return res.redirect('/');

                } else {
                    console.log("用戶或密碼不正確");
                    req.flash('error', "用戶或密碼不正確");
                    return res.redirect('back');

                }

            }
        });
    }, function(err) {
        console.log(err);
    });

})

//用戶退出
router.get('/logout', function(req, res, next) {
        req.session.username = null;
        req.flash('success', "退出登錄成功眉枕!");
        return res.redirect('/');
    })


pool.end(function (err) {
  // all connections in the pool have ended
  console.log(err);
});
module.exports = router;

參考文檔:
1.http://borninsummer.com/2015/04/14/notes-on-nodejs-express-mysql-and-promise/
2.http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html
3.http://www.cnblogs.com/sword-successful/p/5234890.html
4.http://www.reibang.com/p/0a161f341771

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末低葫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子州弟,更是在濱河造成了極大的恐慌钧栖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婆翔,死亡現(xiàn)場(chǎng)離奇詭異拯杠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)啃奴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阴挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纺腊,你說(shuō)我怎么就攤上這事畔咧。” “怎么了揖膜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵誓沸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我壹粟,道長(zhǎng)拜隧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任趁仙,我火速辦了婚禮洪添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雀费。我一直安慰自己干奢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盏袄。 她就那樣靜靜地躺著忿峻,像睡著了一般薄啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛尚,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天垄惧,我揣著相機(jī)與錄音,去河邊找鬼绰寞。 笑死到逊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滤钱。 我是一名探鬼主播蕾管,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菩暗!你這毒婦竟也來(lái)了掰曾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤停团,失蹤者是張志新(化名)和其女友劉穎旷坦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佑稠,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秒梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捆蜀。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幔嫂,靈堂內(nèi)的尸體忽然破棺而出辆它,到底是詐尸還是另有隱情,我是刑警寧澤履恩,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布锰茉,位于F島的核電站,受9級(jí)特大地震影響切心,放射性物質(zhì)發(fā)生泄漏飒筑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一绽昏、第九天 我趴在偏房一處隱蔽的房頂上張望协屡。 院中可真熱鬧,春花似錦全谤、人聲如沸肤晓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)材原。三九已至沸久,卻和暖如春季眷,著一層夾襖步出監(jiān)牢的瞬間余蟹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工子刮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留威酒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓挺峡,卻偏偏與公主長(zhǎng)得像葵孤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橱赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 總得提供點(diǎn)東西吸引著大家尤仍。VIP視頻解析程序也就是可以看各大站的vip視頻了。(噓狭姨!反正我試了騰訊和愛(ài)奇藝)鏈接:...
    實(shí)在想不出昵稱丶閱讀 139評(píng)論 0 0
  • 20170504宰啦,前兩天菠蘿仔生病請(qǐng)假,今天一大早6:30就自己起床要去幼兒園饼拍,回到家精神還是不太好赡模,不想說(shuō)話,也...
    f魔夜閱讀 681評(píng)論 0 1