今天重点就是三个章节: mysql模块,身份认证 和 大事件后台项目。
本章节主要讲解 mysql模块的使用。
下载模块:
xxxxxxxxxxnpm i mysql@2.18.1代码链接数据库链接池:
xxxxxxxxxx// 1. 导入 mysql 模块const mysql = require('mysql')// 2. 建立与 MySQL 数据库的连接关系const db = mysql.createPool({ host: '127.0.0.1', // 数据库的 IP 地址 user: 'root', // 登录数据库的账号 password: 'admin123', // 登录数据库的密码 database: 'my_db_01', // 指定要操作哪个数据库})// 测试 mysql 模块能否正常工作db.query('select 1', (err, results) => { // mysql 模块工作期间报错了 if(err) return console.log(err.message) // 能够成功的执行 SQL 语句 console.log(results)})mysql模块功能很多,但是我们只学习增删改查相关语句执行;
xxxxxxxxxx// 1.1 查询1// const sqlStr = "select * from users";// 1.2 查询2// 哪怕是一条返回的也是数组, 没有返回的是空数组!const sqlStr = "select * from users where id=2";db.query(sqlStr, (err, result) => { // 错误判断 if (err) return console.log(err.message) // 成功的话,输出结果 // console.log(typeof result, result instanceof Array) console.log(result)})xxxxxxxxxx// 2.添加1// const user = {username: "钢铁侠", password: 'ppp111'};// const strSql = "insert into users (username, password) values (?, ?)";// db.query(strSql, [user.username, user.password], (err, results) => {// // 错误判断// if (err) return console.log(err.message);// // 插入成功// if (results.affectedRows === 1) {// console.log(results);// console.log("添加用户成功!");// } // })// 2.添加2(没有这样的语句,是mysql模块内部进行的字符串优化)const user = {username: '钢铁侠222', password: '123123'};const strSql = "insert into users set ?";db.query(strSql, user, (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 1) { console.log("添加成功!") }})xxxxxxxxxx// // 3.修改1// const user = {id: 8, password: '000', status: 1};// const strSql = "update users set password=?,status=? where id=?";// db.query(strSql, [user.password, user.status, user.id], (err, results) => {// if (err) return console.log(err.message);// if (results.affectedRows == 1) console.log("修改成功!")// })// 3.修改2(没有这样的语句,是mysql模块内部进行的字符串优化)const user = {id: 1, password: '1111', status: 0};const strSql = "update users set ? where id=?";db.query(strSql, [user, user.id], (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 1) console.log("修改成功!")})xxxxxxxxxx// // 4.删除1// const strSql = "delete from users where id=?";// db.query(strSql, 2, (err, results) => {// if (err) return console.log(err.message);// if (results.affectedRows == 1) console.log("删除成功!")// })// 4.删除2const strSql = "update users set status=? where id=?";db.query(strSql, [1, 1], (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 1) console.log("删除成功!")})
本章节主要讲解,身份认证的两种方式:session+cookie 和 token认证。
通过配置session,设置加密信息,为req对象上面绑定 session 属性,此属性会根据cookie解析数据:
xxxxxxxxxx// 配置session// npm i 安装所有依赖包// npm i express-session@1.17.1const session = require("express-session");app.use(session({ secret: 'itcast', // 加密 resave: false, // 可以去npm网站去查 saveUninitialized: false // 可以去npm网站去查}))用户登录成功,根据不同用户的 cookie,向 session 存储对应数据:
xxxxxxxxxx// 用户名密码输入正确; 发送信息给客户端, 并设置session// 配置完 session 中间件才会在req上多出session这个属性req.session.user = req.body; // 这两个值,不是直接绑定的,而是根据cookie值绑定的;req.session.islogin = true; // 这两个值,不是直接绑定的,而是根据cookie值绑定的;// 在这个位置,发送的时候,会把生成的 cookie ,通过响应头的方式,一起发送给客户端res.send({ status: 0, msg: "登录成功!"});从 session 中根据不同用户的 cookie 获取,之前存储过的信息:
xxxxxxxxxx// 获取用户名app.get("/api/username", (req, res) => { // 判断: 用户是否登陆, 也是根据cookie判断,根据cookie获取islogin if (!req.session.islogin) return res.send({status: 1, msg: 'fail'}) res.send({ status: 0, msg: 'success', // 从 session 中根据不同用户的 cookie 获取,之前存储过的信息 username: req.session.user.username })})从 session 中销毁对应cookie的数据:
xxxxxxxxxx// 4.3 退出登陆app.post("/api/logout", (req, res) => { // 销毁session中对应的cookie req.session.destroy(function () { // 销毁客户端浏览器中指定的cookie res.clearCookie("connect.sid") // 响应客户端 res.send({status: 0, msg: '退出成功!'}) });})token认证是现在开发中最常用的身份认证方式,需要前端程序员,手动设置 token 的接收,保存,发送。服务端需要两个不同功能的包完成对应功能,一个用于生成 token,另一个用户认证 token。
xxxxxxxxxx// 1.下载两个对应的第三方包// 生成 token : npm i jsonwebtoken@8.5.1 // 认证 token : npm i express-jwt@5.3.3// 2.导入两个第三方包const jwt = require("jsonwebtoken");const expressJWT = require("express-jwt");利用 jsonwebtoken 包生成token,并发送到客户端:
xxxxxxxxxx// 定义加密字符串const secretKey = "lvchao@itcast.cn";// 登录的路由app.post("/api/login", (req, res) => { // 登录判断 const userinfo = req.body; if (userinfo.username != "admin" || userinfo.password !== "000000") { res.send({ status: 400, message: '用户名或者密码错误!' }); } else { // 生成token: 三个参数: 要加密的对象, 加密字符串, 有效时长; const tokenStr = "Bearer " + jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: "30s" }); res.send({ status: 200, message: '登录成功!', token: tokenStr }); }});利用 express-jwt 包认证客户端是否传递了 token,传递的 token 是否有效,是否正确:
xxxxxxxxxxapp.use( expressJWT({ secret: secretKey }) .unless({ path: [/^\/api\//] }) // unless参数是对象,path属性值是数组);对于身份认证失败的用户,进行错误处理:
xxxxxxxxxx// 错误处理app.use((err, req, res, next) => { if (err.name == "UnauthorizedError") { res.send({ status: 401, message: '无效的token' }); } res.send({ status: 500, message: '未知的错误!' })})项目代码参数:http://www.escook.cn:8088/#/