前言
Express 4.17.1
基于 Node.js 平台,快速、开放、极简的 Web 开发框架
本章介绍Express如何连接mysql 和 生成jwt
Express 连接数据库
第一步 安装mysql
yarn add mysql 或者 npm i mysql
第二步 在src目录下创建mysql.js文件
const mysql = require('mysql')
//创建连接池
const pool = mysql.createPool({
connectionLimit: 10, // 连接池
host: 'localhost',
user: 'root', // 数据库用户名
password: 'root', // 数据库密码
port: '3306',
database: 'tbb-shop', // 数据库名称
multipleStatements: true //允许每个mysql语句有多条查询.使用它时要非常注意,因为它很容易引起sql注入攻击(默认:false).
})
// 下方是一个使用案例
// 需求: 查询id等于1的用户信息
router.get('/query/:id', (req, res) => {
let { id } = req.params;
------------------------重要部分--------------------------------
pool.getConnection((err, connection) => {
if (err) return return err
connection.query('select * from user where id = ?', [1], (error, results) => {
if (error) {
return error
} else {
res.json({code: 200, data: results[0], msg:'0k'}) // 成功返回的数据
}
// 将连接返回到连接池中, 准备让其他人重复使用
connection.release()
})
})
----------------------------------------------------------------
})
连接池自我介绍:
创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
// 这是单个创建连接的例子, 可以了解一下
// var connection = mysql.createConnection({
// host: 'localhost',
// port: 3306,
// user: 'root',
// password: 'root',
// database: 'tbb-shop'
//});
//connection.connect( (err) => {
// if (err) {
// console.log(' err);
// return;
// }
// console.log('connection connect succeed!');
//});
下面我们将连接方法进行封装
const mysql = require('mysql')
//创建连接池
const pool = mysql.createPool({
connectionLimit: 10, // 连接池
host: 'localhost',
user: 'root', // 数据库用户名
password: 'root', // 数据库密码
port: '3306',
database: 'tbb-shop', // 数据库名称
multipleStatements: true //允许每个mysql语句有多条查询.使用它时要非常注意,因为它很容易引起sql注入攻击(默认:false).
})
let query = (sql, values=[], callback) => {
if (!sql) return
return new Promise((resolve, reject) => {
// 建立连接
pool.getConnection((err, connection) => {
if (err) return resolve(err)
connection.query(sql, values, (error, results, fields) => {
if (error) {
reject({code: 500, error})
} else {
resolve(results)
}
// 将连接返回到连接池中, 准备让其他人重复使用
connection.release()
callback && callback(results, fields)
})
})
})
}
module.exports = query
--- query.js
// 下方是一个使用案例
// 需求: 查询id等于1的用户信息
const query = require('./mysql.js')
router.get('/query/:id', async(req, res) => {
let { id } = req.params;
let details = await query(select * from user where id = ?, [id])
if (details) {
res.json({code: 200, data: details[0], msg:'0k'})
}
})
JWT, 生成Token
首先在创建app.js
-- app.js
const express = require('express')
const Jwt = require('express-jwt')
const app = express()
// JWT 解密
app.use(Jwt({
secret: 'express_jwt_NB', //密钥
algorithms:['HS256'] // 加密方式
}).unless({
path: ['/login'] // 不需要验证的路由
}))
// 验证token是否过期,是否有效, 将token解析成用户信息放到req.data里, 每次请求接口都可以获取到
app.use((req, res, next) => {
let token = req.headers['authorization'];
if (token == undefined) res.status(403).send({ code: -1, msg: '无效的token' })
jwt.verify(token.split(' ')[1], 'express_jwt_NB', (err, decoded) => {
if (err.name === 'JsonWebTokenError') {
res.status(403).send({ code: -1, msg: 'Token无效' })
} else if (err.name === 'TokenExpiredError') {
res.status(403).send({ code: -1, msg: 'Token过期' })
} else {
req.data = decoded
}
})
return next()
})
app.listen(8088, () => {
console.log(8080);
});
// 将用户信息生成token
const express = require('express')
const router = express.Router()
const { query } = require('../db/mysql')
const jwt = require('jsonwebtoken')
router.post('/login', async(req, res) => {
const { username, password } = req.body
const token = jwt.sign({
data: username,
expiresIn: 60 * 60 * 3, // 设置 token 3小时过期
}, 'express_jwt_NB')
res.json({code: 200, data: { token, msg: 'ok' }})
})
module.exports = router
const express = require('express')
const router = express.Router()
const { query } = require('../db/mysql')
router.post('/add/user', async(req, res) => {
let { data } = req // 这里就是token解密以后的用户信息
...
})
module.exports = router