Node连接mysql之——登陆验证(1)

3 篇文章 0 订阅
3 篇文章 0 订阅

写了这么久前端忽然想看一下后台大佬的世界,所以就看了一下nodeJS中的express框架和koa
不过今天咱们不说这玩意儿,而是讲一下我们最重要的东西:数据库的连接

要用到数据库当然少不了我们稳定可靠的mysql咯,我们要试着做一个验证登陆的东西,所以做如下配置

const express = require('express');
const session = require('express-session');
const bodyparser = require('body-parser');
const mysql = require('mysql');

先将包引入

之后我们来建个表,名字嘛,就叫login好啦
在这里插入图片描述

里边存的东西咱们也不用太花哨,俩就行
至于链接数据库,官方文档给了:
在这里插入图片描述

那咱就按照他给的来

查询语句就写'SELECT * FROM login where username="Sir"';
结果是这个:
在这里插入图片描述
很好,起作用了呢。

接下来我们把我们的登陆验证加进去

const app = express();

// 配置
var db_config = {
    host: 'localhost',
    user: 'root',
    password: 'aa123456',
    database: 'log&redirect'
}

// 链接数据库
var connection = mysql.createConnection(db_config);

// 利用connection.connect()回调函数添加重连功能
function handleDisconnect() {
    connection.connect(function(err) {
        // callback(err,result);
        if (err) {
            console.log(err);
            console.log("try to connect");
            setTimeout(handleDisconnect, 1000); //经过1秒后尝试重新连接
            return;
        }
        console.log("Reset had Success");
    });
}
handleDisconnect();


// 下面三行设置渲染的引擎模板
app.set('views', __dirname); //设置模板的目录
app.set('view engine', 'html'); // 设置解析模板文件类型:这里为html文件
app.engine('html', require('ejs').__express); // 使用ejs引擎解析html文件中ejs语法


app.use(bodyparser.json()); // 使用bodyparder中间件
app.use(bodyparser.urlencoded({ extended: true }));


// 使用 session 中间件
app.use(session({
    secret: 'secret', // 对session id 相关的cookie 进行签名     加密?
    resave: true,
    saveUninitialized: false, // 是否保存未初始化的会话
    cookie: {
        maxAge: 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒     保存时间为3min
    },
}));

// 获取登录页面
app.get('/login', function(req, res) {
    req.session.userName = null; // 删除session
    res.render(__dirname + '/views/login.html');
    // res.sendFile(__dirname + '/views/login.html')
});
//这里还有一个好处。手动跳转Login页面时它仍然不会更新你的localStorage数据,也就是说缓存依然存在


// 用户登录
app.post('/login', function(req, res) {

    var user = req.body.username;
    var pass = req.body.pwd;

    console.log(user);
    console.log(pass);

    // 只要要搜索的东西是字符串那么必须加上单引号!(user和pass外边都包了)
    var sql = "SELECT * FROM login where username='" + user + "' and password='" + pass + "'";
    console.log(sql);

    //查
    connection.query(sql, function(err, result) {
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            return;
        }

        console.log('--------------------------SELECT----------------------------');
        console.log(result);
        console.log('------------------------------------------------------------\n\n');

        if (result) {
            req.session.userName = req.body.username; // 登录成功,设置 session
            //重定向至根路径
            res.redirect('/');
        } else {

            //若账号和密码错误则显示此文字,并在3s之后自动跳转到login页面。但是这里出现了问题。
            res.json({ ret_code: 1, ret_msg: '账号或密码错误' }); // 若登录失败,重定向到登录页面
            setTimeout(function() {
                res.redirect('/login');
            }, 3000);
        }
    });
    connection.end();

// 获取主页
app.get('/', function(req, res) {
    if (req.session.userName) { //判断session 状态,如果有效,则返回主页,否则转到登录页面
        console.log('获取主页时的req.session = ' + JSON.stringify(req.session));
        res.render(__dirname + '/views/home', { username: req.session.userName }); //给home.html页面传递username数据
        req.session.userName = null; // 删除session
    } else {
        res.redirect('/login');
    }
})


// 退出
app.get('/logout', function(req, res) {

    console.log('退出登录前的req.session = ' + JSON.stringify(req.session));

    req.session.userName = null; // 删除session
    // res.cookie(prop, '', { expires: new Date(0) }); //为什么清除掉cookie也不可以?每次都是删除不彻底

    console.log('退出登录后的req.session = ' + JSON.stringify(req.session));
    
    res.redirect('/login');
});


app.listen(8080, function() {
    console.log('http://127.0.0.1:8080')
})

如图,我们利用express框架建立了逻辑关系:若用户未登录则直接重定向至登陆界面,若登陆则通过验证cookie来完成其用户页面的跳转。退出登录则清除cookie

非常的完美。还缺了点什么呢?

当然是我们的加密!还有数据库的简化!

  • 如果不加密那么明文的密码就非常容易失窃了。如果请求被人截取一眼就能看到你那精心设置的密码(我们学校官网之前就是这样,现在终于加密了)
  • 数据库每次的查询都必须进行一次开关,非常的浪费性能。我们需要将其封装起来,以达到最优速度,减少时间的浪费
  • 同时增删改查四个功能我们只搞了一个,有点不爽。

下次更新的时候我会把这些问题都给解决掉!
最后附上我们文件结构
在这里插入图片描述

后会有期
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值