[记录六] Vue(全家桶)+node+koa2+mysql+nginx+redis,博客全栈项目之node后台连接mysql和redis,登陆接口的编写 C# 读取XML配置文件 MongoDB数据库设置密码 Redis之重设密码及开启远程访问 本地Navicat连接阿里云MySQL数据库注意要点 PHP Windows系统实现定时任务的两种方式bat版 面试官让我手写promise,我这样写,他很满意 超级码力在线编程大赛初赛 第二场 UML类图的依赖和关联详解(含代码) 【C语言】新手实现简单的石头剪刀布人机对战 Codeforces Round #666 (Div. 2)题解ABC Codeforces Round #666 (Div. 2)E Monster Invaders 华为今年不会推出运行鸿蒙OS的手机;Deno 1.3.2发布|极客头条 异或在笔试题中的超神表现 超级码力在线编程大赛初赛 第2场 T1-T4题解 1397D. Stoned Game(博弈) Codeforces Round #666(Div.2)A~D题题解 高性能微服务架构技术选型 阿里饿了么Java4面:(数据结构+框架源码+JVM+分布式) 2020java面试总结 使用ffmpeg提取mp4内部日期重命名文件(需lua) 【剑指Offer】56.2 数组中只出现一次的数字,其他出现3次 JAVA二三事-使用IO+Properties实现动态读取文本信息 排序算法的C语言实现C代码(未更完) RT-Thread 内核学习--信号量的初步使用 【剑指Offer】57.2 和为S的连续正数序列 Qt三方库开发技术:QXlsx介绍、编译和使用 4G DTU模块的作用和功能说明 【Tips】- Wifi模块和4G无线通信 【5G核心网】 Identifiers 身份标识 DPDK支持的硬件:CPU、网卡NIC、加密引擎、基带加速器 如何根据普通ip地址获取当前地理位置 人工智能能力提升指导总结 520了,用32做个简单的小程序 程序员的数学--用贝叶斯定理来推断一个案子 文旅部新规:在线旅游网站不得擅自屏蔽删除评价 不得大数据杀熟 苏宁易购开学季消费大数据:手机以旧换新销量增长299% 做实供电服务“133” 助大数据直上“云”端 思科前程序员离职 5 月后“删虚拟机跑路”,240 万美元打水漂,网友:够狠! 抗疫代码成国博最新藏品 阿里程序员“写代码写进国博挺酷” 国博史上首次收藏代码!它们是阿里程序员写下的抗疫代码 威胜信息发布2020年上半年业绩:物联网产业进入爆发期 营收净利双增长 下月发布会不止有新品折叠屏手机 酷开的物联网家居生态野心初现 史上最全的数据库面试题 数据库面试必看 一个数据库SQL查询的数次轮回 百度智能云正式对外发布百度智能云数据库品牌GaiaDB 数据库三大泛式是什么 电力行业网管需求 IT运维管理解决方案 citrix桌面虚拟化中的运维工具Director SRE运维体系的构建和工作职责划分
您的位置:首页 >物联网 >

[记录六] Vue(全家桶)+node+koa2+mysql+nginx+redis,博客全栈项目之node后台连接mysql和redis,登陆接口的编写

导语:

暑假在家闲着无事,就琢磨着做一个web博客练练手,现在已经做完了,把过程分享出来给大家看看,分享一下学习经验。这是第六篇,开始编写后台接口,为前端接口提供提供基础,主要讲node,koa2,redis,mysql的连接和接口的编写。

微信搜索 【web小馆】,回复 ”全栈博客项目“,即可获取 项目源码和后续的实战文章教程。

本文的目录

一,连接mysql二,连接redis三,登陆、注册接口的编写

一,连接mysql

我们先创建一个conf目录,下面再创建一个db.js用来存放msyql和reids的配置,创建一个controller用来编写各个部分的路由接口,创建一个db下面mysql.js用来统一执行sql语句。

在这里插入图片描述
conf下面的db.js

const env = process.env.NODE_ENVlet MYSQL_CONFlet REDIS_CONFif (env === "dev") {MYSQL_CONF = {host: "localhost",user: "root",password: "********",port: "3306",database: "myarticle"}//redis_confREDIS_CONF = {port: 6379,host: "127.0.0.1"}}if (env === "production") {//mysqlMYSQL_CONF = {host: "172.29.75.29",user: "root",password: "*********",port: "3306",database: "myarticle"}//redis_confREDIS_CONF = {port: 6379,host: "172.29.75.29"}}module.exports = {MYSQL_CONF,REDIS_CONF}

db文件夹下面的mysql.js,用来统一执行sql语句

const mysql = require("mysql")const { MYSQL_CONF } = require("../conf/db")// 创建链接对象const con = mysql.createConnection(MYSQL_CONF)// 开始链接con.connect()// 统一执行 sql 的函数function exec(sql) {const promise = new Promise((resolve, reject) => {con.query(sql, (err, result) => {if (err) {reject(err)return}resolve(result)})})return promise}module.exports = {exec,escape: mysql.escape}

到这里我们就已经用代码把mysql和我们的node后台连接在一起了,可以直接在代码中使用sql语句操作数据库。

二,连接redis

这里我们的登陆要做成session,所以我们要在app.js里面做一些操作。补充一部分代码。

const session = require("koa-generic-session")const redisStore = require("koa-redis")//session配置app.keys = ["xiaomizhou12345"]app.use(session({//配饰cookiecookie: {path: "/",httpOnly: true,maxAge: 24 * 60 * 60 * 1000},//配置redisstore: redisStore({all: "127.0.0.1:6379"//写死本地redis})}))

三,登陆、注册接口的编写

const router = require("koa-router")()const path = require("path")const fs = require("fs")const { login, signup, updataavatar, updataname } = require("../controller/user")const { SuccessModel, ErrorModel } = require("../model/resModel")router.prefix("/api/user")const env = process.env.NODE_ENV//登陆router.post("/login", async function (ctx, next) {const { username, password } = ctx.request.bodyconst data = await login(username, password)//console.log(data.username)if (data.username) {ctx.session.username = data.usernamectx.session.realname = data.realnamectx.body = new SuccessModel(data)return }ctx.body = new ErrorModel("登陆失败")})//注册router.post("/signup", async function (ctx, next) {const { username, password, realname, email } = ctx.request.bodyconst data = await signup(username, password, realname, email)// console.log(data)// console.log(data.num)if (data.num == 0) {ctx.body = new SuccessModel("注册成功",data.id)return }ctx.body = new ErrorModel("注册失败")})module.exports = router

接口调用后使用await函数,让sql语句去执行,最后把执行的结果回传回来。我们先来看一下controller文件夹里面关于signup和login的函数是怎么写的。

const { exec, escape } = require("../db/mysql")const { genPassword } = require("../utils/cryp")//登陆const login = async (username, password) => {username = escape(username)// 生成加密密码password = genPassword(password)password = escape(password)console.log(password)const sql = `select username, realname, avatar, likes, goods from users where username=${username} and passworded=${password}`const rows = await exec(sql)return rows[0] || {}}// 注册const signup = async (username, password, realname, email) => {username = escape(username)// 生成加密密码password = genPassword(password)password = escape(password)let test = `select username from users where username=${username}`//注册时检验有无相同账号const testData = await exec(test)console.log(testData,testData.length)if (testData.length > 0) {return {num: testData.length,id: 0}}const sql = `insert into users (username, realname, passworded, email, likes, goods) values (${username}, "${realname}", ${password}, "${email}", "", "");` //注册const insertData = await exec(sql)return {num: 0,id: insertData.insertId}}

我们可以看到注册执行函数在注册钱先去执行了这个账户有没有被注册,如果被注册了的话就会返回已经被注册的信息出来,如果没有注册将继续执行下面的操作。

我们对于账户的信息肯定是要注重安全的,所以我们要给账户的密码加密,让用户在注册的时候,如果密码是123,经过加密后会生成一串加密码。现在我们来看一下加密函数。

const crypto = require("crypto")//密匙const SECRET_KEY = "xiaomizhou12345#"//加密function md5(content) {let md5 = crypto.createHash("md5")return md5.update(content).digest("hex")}function genPassword(password) {const str = `password=${password}&key=${SECRET_KEY}`return md5(str)}module.exports = {genPassword}

这样加密后的密码,只有用户输入跟注册时候的123,转变成一串加密码,跟数据库的加密码一样才能登陆成功。这样就算数据库被泄露了,黑客也很难登陆我们的账号,同时账号输入这里也做了一层防御sql注入的手段,即

username = escape(username)password = escape(password)

全面保护数据的安全,这样才是一个合格的后台程序和数据库。

在这里插入图片描述

补充:

微信搜索【web小馆】,回复全栈博客项目,即可获取项目源码和后续的实战文章教程。每天用最简单朴实的语言,潜移默化的提升你的计算机基础知识和前端技术。小米粥,一个专注的web全栈工程师,我们下期再见!

在这里插入图片描述
node后台

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。