db目录下存放数据库操做语句:
userSQL.js 用户有关的操做语句
router目录 接口路由文件
user.js 用户接口路由
connect.js 数据库链接
index.html前端测试页面
index.js 入口文件html
{ "name": "api", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "hotnode index.js" }, "author": "yanxiafei", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "cookie-parser": "^1.4.4", "cors": "^2.8.5", "express": "^4.17.1", "mysql": "^2.17.1" } }
const { app, pool } =require('./connect') const user = require('./router/user') app.all('*', (req, res, next) => { //这里处理全局拦截,必定要写在最上面 next() }) app.get('/', (req,res) => { //首页路由 res.sendFile(__dirname+'/'+'index.html') }) app.all('/', (req, res) => { pool.getConnection((err, conn) => { res.json({ type: 'test'}) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) app.use('/user', user) app.listen(8088, () => { console.log('服务启动','localhost:8088') })
建立链接池前端
const mysql = require('mysql') const express = require('express') const app = express() const router = express.Router(); // 解析参数 const bodyParser = require('body-parser') // json请求 app.use(bodyParser.json()) // 表单请求 app.use(bodyParser.urlencoded({extended: false})) /** * 配置mysql */ const option = { host: 'localhost', user: 'root', password: 'root', port: '3306', database: 'nodecms', connectTimeout: 5000, //链接超时 multipleStatements: false //是否容许一个query中包含多条sql语句 } let pool; repool() function Res ({ code = 200, msg = '', data = {} }) { this.code = code; this.msg = msg; this.data = data; } function resJson (_res, result) { return _res.json(new Res(result)) } // 断线重连机制 function repool() { // 建立链接池 pool = mysql.createPool({ ...option, waitForConnections: true, //当无链接池可用时,等待(true)仍是抛错(false) connectionLimit: 100, //链接数限制 queueLimit: 0 //最大链接等待数(0为不限制) }) pool.on('error', err => { err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 2000) }) app.all('*', (_,__, next) => { pool.getConnection( err => { err && setTimeout(repool, 2000) || next() }) }) } module.exports = { app, pool, router, resJson }
用户操做接口node
const { pool, router, resJson } = require('../connect') const userSQL = require('../db/userSQL') /** * 用户登陆功能 */ router.get('/login', (req, res) => { let user = { username: req.query.name, password: req.query.password } let _res = res; // 判断参数是否为空 if (!user.username) { return resJson(_res, { code: -1, msg: '用户名不能为空' }) } if (!user.password) { return resJson(_res, { code: -1, msg: '密码不能为空' }) } let _data; // 从链接池获取链接 pool.getConnection((err, conn) => { conn.query(userSQL.queryByNamePassword, [user.username, user.password], (e, result) => { if (e) _data = { code: -1, msg: e } //经过用户名和密码索引查询数据,有数听说明用户存在且密码正确,只能返回登陆成功,不然返回用户名不存在或登陆密码错误 if (result && result.length) { _data = { msg: '登陆成功', data: { userInfo: { username: user.username } } } } else { _data = { code: -1, msg: '用户名不存在或登陆密码错误' } } resJson(_res, _data) }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) /** * 注册用户功能 */ router.get('/register', (req, res) => { // 获取前台页面传过来的参数 let user = { username: req.query.name, realname: req.query.realname, password: req.query.password } let _res = res; // 判断参数是否为空 if (!user.username) { return resJson(_res, { code: -1, msg: '用户名不能为空' }) } if (!user.realname) { return resJson(_res, { code: -1, msg: '真实姓名不能为空' }) } if (!user.password) { return resJson(_res, { code: -1, msg: '密码不能为空' }) } let _data; // 整合参数 // 从链接池获取链接 pool.getConnection((err, conn) => { // 查询数据库该用户是否已存在 conn.query(userSQL.queryByName, user.username, (e, r) => { if (e) _data = { code: -1, msg: e } if (r) { //判断用户列表是否为空 if (r.length) { //如不为空,则说明存在此用户 _data = { code: -1, msg: '用户已存在' } } else { //插入用户信息 conn.query(userSQL.insert, user, (err, result) => { if (result) { _data = { msg: '注册成功' } } else { _data = { code: -1, msg: '注册失败' } } }) } } setTimeout(() => { //把操做结果返回给前台页面 resJson(_res, _data) }, 200); }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) /** * 修改密码 */ router.get('/updatePassword', (req, res) => { let user = { username: req.query.name, oldPassword: req.query.oldPassword, newPassword: req.query.newPassword, againPassword: req.query.againPassword } let _res = res; // 判断参数是否为空 if (!user.username) { return resJson(_res, { code: -1, msg: '用户名不能为空' }) } if (!user.oldPassword) { return resJson(_res, { code: -1, msg: '旧密码不能为空' }) } if (!user.newPassword) { return resJson(_res, { code: -1, msg: '新密码不能为空' }) } if (!user.againPassword || user.againPassword !== user.newPassword) { return resJson(_res, { code: -1, msg: '请确认新密码或两次新密码不一致' }) } // 整合参数 // 从链接池获取链接 pool.getConnection((err, conn) => { // 查询数据库该用户是否已存在 conn.query(userSQL.queryByNamePassword, [user.username, user.oldPassword], (e, r) => { if (e) _data = { code: -1, msg: e } if (r) { //判断用户列表是否为空 if (r.length) { //如不为空,则说明存在此用户且密码正确 conn.query(userSQL.updateUser, [{ password: user.newPassword }, user.username], (err, result) => { console.log(err) if (result) { _data = { msg: '密码修改为功' } } else { _data = { code: -1, msg: '密码修改失败' } } }) } else { _data = { code: -1, msg: '用户不存在或旧密码输入错误' } } } setTimeout(() => { //把操做结果返回给前台页面 resJson(_res, _data) }, 200); }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) /** * 删除用户 */ router.get('/deleteUser', (req, res) => { // 获取前台页面传过来的参数 let user = { username: req.query.name } let _res = res; // 判断参数是否为空 if (!user.username) { return resJson(_res, { code: -1, msg: '用户名不能为空' }) } let _data; // 整合参数 // 从链接池获取链接 pool.getConnection((err, conn) => { // 查询数据库该用户是否已存在 conn.query(userSQL.queryByName, user.username, (e, r) => { if (e) _data = { code: -1, msg: e } if (r) { //判断用户列表是否为空 if (r.length) { //如不为空,则说明存在此用户 conn.query(userSQL.deleteUser, user.username, (err, result) => { if (err) _data = { code: -1, msg: e } if (result) { _data = { msg: '删除用户操做成功' } } }) } else { _data = { code: -1, msg: '用户不存在,操做失败' } } } setTimeout(() => { //把操做结果返回给前台页面 resJson(_res, _data) }, 200); }) pool.releaseConnection(conn) // 释放链接池,等待别的链接使用 }) }) module.exports = router;
操做数据库语句-用户增删改查mysql
const userSQL = { queryAll: 'select * from user', // 查询全部用户 queryByName: 'select * from user where username=?', // 经过用户名索引查询用户 queryByNamePassword: 'select * from user where username=? and password=?', // 经过用户名和密码索引查询用户 insert: 'insert into user set ?', // 插入新用户 updateUser: 'update user set ? where username=?',// 更新用户信息 deleteUser: 'delete from user where username=?' // 删除用户 } module.exports = userSQL
前端测试html页面sql
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> form { width: 300px; margin: 30px; padding: 30px 50px 50px; border: 1px solid #dcdcdc; float: left; } label { display: flex; line-height: 30px; margin-bottom: 20px; } span { width: 100px; } input { flex: 1; border: 1px solid #dcdcdc; } input[type="submit"] { color: #fff; background: #f43553; width: 100%; height: 40px; line-height: 40px; } </style> </head> <body> <form action="http://localhost:8088/user/login"> <h2>登陆</h2> <label for=""> <span>用户名</span> <input type="text" name="name" /> </label> <label for=""> <span>密码</span> <input type="password" name="password" /> </label> <input type="submit" value="提交"> </form> <form action="http://localhost:8088/user/register"> <h2>注册</h2> <label for=""> <span>用户名</span> <input type="text" name="name" /> </label> <label for=""> <span>真实姓名</span> <input type="text" name="realname" /> </label> <label for=""> <span>密码</span> <input type="password" name="password" /> </label> <input type="submit" value="提交"> </form> <form action="http://localhost:8088/user/updatePassword"> <h2>修改密码</h2> <label for=""> <span>用户名</span> <input type="text" name="name" /> </label> <label for=""> <span>密码</span> <input type="text" name="oldPassword" /> </label> <label for=""> <span>密码</span> <input type="text" name="newPassword" /> </label> <label for=""> <span>密码</span> <input type="text" name="againPassword" /> </label> <input type="submit" value="提交"> </form> <form action="http://localhost:8088/user/deleteUser"> <h2>删除用户</h2> <label for=""> <span>用户名</span> <input type="text" name="name" /> </label> <input type="submit" value="提交"> </form> </body> </html>
再查看数据库,数据已经删除了
数据库