Node.js, express连接mysql,和生成 Token

1,840 阅读3分钟

前言

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

项目地址 gitee.com/YangY19/exp…