写了这么久前端忽然想看一下后台大佬的世界,所以就看了一下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
非常的完美。还缺了点什么呢?
当然是我们的加密!还有数据库的简化!
- 如果不加密那么明文的密码就非常容易失窃了。如果请求被人截取一眼就能看到你那精心设置的密码(我们学校官网之前就是这样,现在终于加密了)
- 数据库每次的查询都必须进行一次开关,非常的浪费性能。我们需要将其封装起来,以达到最优速度,减少时间的浪费
- 同时增删改查四个功能我们只搞了一个,有点不爽。
下次更新的时候我会把这些问题都给解决掉!
最后附上我们文件结构
后会有期