Node.js + Express 4.x + MongoDB 构建登录注册-简易用户管理(五)
Node.js连接MongoDB、封装DBHelp、增删查改 都集齐了。
下面开始Node.js连接MySQL。
假设,正在看博客的读者有一定的T-SQL基础。
一、安装MySQL
MySQL 5.7.17版: http://pan.baidu.com/s/1hsMcQFi
提取码:8leg
安装MySQL的时候,步骤中会要求输入root的密码,请妥善保管,后面有用。
MySQL也是命令行形式的操作不方便,需要操作管理平台,这里推荐Navicat。
Navicat Premium 11.0.17 64位:http://pan.baidu.com/s/1bSezqY
提取码:q2hl
二、安装mysql模块
执行命令:npm install mysql
三、连接MySQL
mysql数据库,新建库userinfo,新建表users,表里有3个字段(id、username、password),其中id自动增加。
废话不多说,直接贴上封装成DBHelp以后的代码,如下:
const mysql=require('mysql'); let connection=mysql.createConnection({ host:'localhost', user:'root', password:'****', //填自己mysql数据库的密码 database:'userinfo' }); function DBHelp(){} /************************** * * 功能:查询 * 参数:sqlStr(SQL语句)、callback(回调函数) * **************************/ DBHelp.prototype.Find=function(sqlStr,callback) { connection=mysql.createConnection(connection.config); connection.connect(); connection.query(sqlStr,function(err,result) { if(err) { console.log(err); return; } callback(result); /* result是数组对象,类似:[RowDataPacket{username:'fuzq'},RowDataPacket{username:'admin'}] */ }); connection.end(); }; /************************** * * 功能:添加 * 参数:sqlStr(SQL语句)、data(添加的数据)、callback(回调函数) * **************************/ DBHelp.prototype.Add=function(sqlStr,data,callback) { connection=mysql.createConnection(connection.config); connection.connect(); connection.query(sqlStr,data,function(err) { if(err) { console.log(err); return; } callback(); }); connection.end(); }; /************************** * * 功能:删除 * 参数:sqlStr(SQL语句)、callback(回调函数) * **************************/ DBHelp.prototype.Delete=function(sqlStr,callback) { connection=mysql.createConnection(connection.config); connection.connect(); connection.query(sqlStr,function(err) { if(err) { console.log(err); return; } callback(); }); connection.end(); }; /************************** * * 功能:修改 * 参数:sqlStr(SQL语句)、data(修改的数据)、callback(回调函数) * **************************/ DBHelp.prototype.Update=function(sqlStr,data,callback) { connection=mysql.createConnection(connection.config); connection.connect(); connection.query(sqlStr,data,function(err) { if(err) { console.log(err); return; } callback(); }); connection.end(); }; module.exports=DBHelp; /* Error: Cannot enqueue Query after invoking quit. 原因:多次调用connection.end()导致的 原因在于node连接上mysql后如果因网络原因丢失连接或者用户手工关闭连接后,原有的连接挂掉,需要重新连接。 那么每次访问都断开连接,就要每次访问都重新建立连接。 另一种解决办法是不使用“mysql”模块,改用“easymysql”模块 “easymysql”模块链接:https://github.com/aleafs/easymysql */
对应的index.js也要修改,代码如下:
var express = require('express'); var router = express.Router(); const DBHelp=require('./DBHelp'); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Index' }); }); //登录 router.route('/login').all(Logined).get(function(req,res) { res.render('login',{title:'Login'}); }).post(function(req,res) { let user={username:req.body.username,password:req.body.password}; let sqlStr='select count(*) as count from users where username="'+user.username+'" and password="'+user.password+'"'; let dbhelp=new DBHelp(); dbhelp.Find(sqlStr,function(result) { if(result[0].count==1) { //出于安全,只把包含用户名存入session req.session.user={username:user.username}; return res.redirect('/home'); } else { req.session.error='用户名不存在或者密码错误!'; return res.redirect('/login'); } }); }); //注册 router.route('/register').all(Logined).get(function(req,res) { res.render('register',{title:'Register'}); }).post(function(req,res) { let newUser={username:req.body.username,password:req.body.password,passwordSec:req.body.passwordSec}; let sqlStr2='select count(*) as count from users where username="'+newUser.username+'"'; let dbhelp=new DBHelp(); dbhelp.Find(sqlStr2,function(result) { if(result[0].count!=1) { if(newUser.password===newUser.passwordSec) { let sqlStr='insert into users(username,password) values(?,?)'; let data=[newUser.username,newUser.password] dbhelp.Add(sqlStr,data,function() { req.session.error='注册成功,请登录!'; return res.redirect('/login'); }); } else { req.session.error='两次密码不一致!'; return res.redirect('/register'); } } else { req.session.error='用户名已存在!'; return res.redirect('/register'); } }); }); //Home用户管理 router.route('/home').all(LoginFirst).get(function(req,res) { let sqlStr='select username from users'; let dbhelp=new DBHelp(); dbhelp.Find(sqlStr,function(result) { if(result) { res.render('home',{title:'Home',Allusers:result}); } else { res.render('home',{title:'Home'}); } }); }); //删除 router.route('/delete/:URLusername').get(function(req,res) { let reqUsername=req.params.URLusername; if(reqUsername!==req.session.user.username) { let sqlStr='delete from users where username="'+reqUsername+'"'; let dbhelp=new DBHelp(); dbhelp.Delete(sqlStr,function() { req.session.error='移除用户 '+reqUsername+' 成功!'; return res.redirect('/home'); }); } else { req.session.error="不能操作当前登录用户!"; return res.redirect('/home'); } }); //重置密码 router.get('/resetPwd/:URLusername',function(req,res) { let reqUsername=req.params.URLusername; if(reqUsername!==req.session.user.username) { let sqlStr='update users set password=? where username=?'; let data=['123456',reqUsername]; let dbhelp=new DBHelp(); dbhelp.Update(sqlStr,data,function() { req.session.error=reqUsername+' 的密码已重置为 123456!'; return res.redirect('/home'); }); } else { req.session.error="不能操作当前登录用户!"; return res.redirect('/home'); } }); //注销 router.get('/logout',function(req,res) { req.session.user=null; return res.redirect('/'); }); function Logined(req,res,next) { if(req.session.user) { req.session.error='您已登录!'; return res.redirect('/home'); } next(); } function LoginFirst(req,res,next) { if(!req.session.user) { req.session.error='请先登录!'; return res.redirect('/login'); } next(); } module.exports = router;