前端进阶 node + koa2 + mysql 后台项目教程

前言

1.koa2 安装 node mysql 和 redis 安装方面就不介绍了,建议百度 主要讲 安装以及里面一些项目的文件呀,而后可让小伙伴们基本了解koa2开发后台,但愿你们能够学到后台开发到思想。建议观看前能够去github上先下载源码而后进行食用,效果更加((QQ群技术讨论)838293023备注(github进来的前端

\color{red}{下期准备小程序云开发的一些我的看法各位对云开发有什么疑问对能够探讨一下}

游泳健身了解一下:github 技术文档 技术文档会持续更新 本期项目地址node

内容总结

  1. 客户端请求 -> nginx(反向代理) (mysql和redis的conf的配置在最下方)
  2. -> router(咱们的接口)
  3. -> middleware(中间件,咱们操做前的一些逻辑能够添加能够不添加)
  4. -> cookie(先后端交互) -> session(后台的变量,重启服务后会清空) -> redis(内存的一个服务来解决session的问题 并能够解决多进程的时候每一个进程能够进行数据交互的任务)
  5. -> controller(咱们写sql 以及一些业务逻辑的地方,主要是处理sql(router的时候也会处理咱们的业务逻辑)
  6. -> model(暂时咱们就写了一个responseModel 主要是用来咱们返回前端数据的中间件)

项目介绍

操做前准备

// 安装 koa 保证node 版本 8以上mysql

npm install -g koanginx

// 安装脚手架git

npm install -g koa-generatorgithub

// project 项目名称redis

koa2 projectsql

cd project // 安装依赖数据库

npm installexpress

// 安装当前 环境变量

npm install cross-env -D

// 安装mysql 和 redis session (nodemon 内置了因此不须要安装)

npm install koa-generic-session mysql redis --save

// 修改package.json dev NODE_ENV=dev

"dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",

1.路由 router

koa的路由不是内置在里面的 咱们须要添加 koa-router 插件 没有能够下载一下npm i koa-router --save 咱们先引入 koa-router 而后直接执行 咱们主要介绍 getpost 回调值,这有一个async这个是es7的解决异步的方法(重点) ctx就是把咱们的requestresponse 合起来 并加了本身的一些方法,next执行后就会继续执行 ,这边咱们看到有一个ctx.body = xxx 的方式这个是回调咱们前端数据方式 和 expressres.json() 是同样的。

1. app.js 里面 koa-jsonkoa-bodyparser 这个是咱们用来接受前端数据而后进行处理的一个依赖

2.注册好( app.use())咱们的依赖后咱们就能够在咱们的router 里面获取到前端传的数据了

// get 获取
const {author:author="",keyword:keyword=""} = context.query;
复制代码
// post 获取
const {author:author="",keyword:keyword=""} = context.request.body;
复制代码

获取到数据咱们就能够进行下一步了

2.middleware 个人中间件厉害的小伙伴能够跳着看

这里咱们添加了一个对用户没有登陆的一个拦截 loginCheck.js

const {ErrorModel} = require('../model/resModel');

module.exports = async (context,next)=>{
    if (context.session.username) {
        await next()
        return
    }
    context.body = new ErrorModel('用户暂未登陆')
}

复制代码

使用方式

4. cookie session 和 redis

const session = require('koa-generic-session')
const redisStore = require('koa-redis')
const {REDIS_CONF} = require('./conf/db')
// session 配置 要进行一个防止 csrf 的攻击
// 进行一个加密 “私密” 咱们的cookie 或者 session 若是被别人拿到就会有风险 因此进行一个加密
// 相对于密码咱们也会进行一个加密 就算是库被别人扒了别人也不会知道密码是什么
app.keys = ['Jin_jin#!'] 
app.use(session({
//    配置cookie
    cookie: {
        path: '/', // 路由均可以操做 默认是调用都哪一个路由
        httpOnly: true, // 只有服务器能够操做
        maxAge: 24*60*60*1000 // 时间
    },
    store: redisStore({ // 进行一个 redis 的获取和赋值
        all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
    })
}))
复制代码

配置好以后咱们就能够直接使用 context.session 来获取和设置 sessionredis

5.controller 咱们写 sql 的地方

下面代码 escape 和 where 1=1 都是很是实用的小技巧 escape是为了别人经过输入的数据进行对数据库的一个特殊的操做的进行防护的功能 好比别人输入userName = ' -- 而后对数据库进行一些操做 因此咱们在写这些sql 的时候都要考虑更多一点

## blog controller
const {exec} = require('../db/mysql')
const getList = async (author,keyword)=>{
    // 先返回假数据(格式正确) where 1=1 是一个小技巧
    let sql = `select * from blog where 1=1`;
    if (author) {
        sql += ` and author='${author}'`
    }
    if (keyword) {
        sql += ` and title like '%${keyword}%'`
    }
    sql += ` order by createtime desc`;

    // 返回一个promise
    return await exec(sql)
}
复制代码
## user controller
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);
    let sql = `select user_name,realname from users where user_name=${userName} and password=${password}`;
    const userData = await exec(sql);
    return userData[0]||{}
}

module.exports = {
    login
}

复制代码

使用

6.model

咱们对返回前端时候对数据进行一次处理 返回前端的就是一个实例,

class BaseModel {
    constructor(data,message){
        if(typeof data === 'string'){
            this.message = data;
            data         = null;
            message      = null;
        }
        if(data){
            this.data = data;
        }
        if(message){
            this.message = message;
        }
    }
}

class SuccessModel extends BaseModel{
    constructor(data,message){
        super(data,message);
        this.errno = 0
    }
}

class ErrorModel extends BaseModel{
    constructor(data,message){
        super(data,message);
        this.errno = -1
    }
}

module.exports = {
    SuccessModel,
    ErrorModel
}
复制代码

// 添加conf 文件夹 里面添加 db.js 管理当前 当前mysql 的配置 以及 redis 的配置

mysql redis conf

const env = process.env.NODE_ENV;
let MYSQL_CONF;
let REDIS_CONF;

if (env === 'dev') {
    MYSQL_CONF = {
        host: 'xx.xx.xx.xx',
        user: 'xx',
        password: 'xx',
        port: '3306',
        database: 'newTable'
    }
    REDIS_CONF = {
        host: '127.0.0.1',
        port: '6379'
    }
}

if (env === 'production') {
    MYSQL_CONF = {
        host: 'xx.xx.xx.xx',
        user: 'xx',
        password: 'xx',
        port: '3306',
        database: 'newTable'
    }
    REDIS_CONF = {
        host: '127.0.0.1',
        port: '6379'
    } 
}

module.exports = {
    MYSQL_CONF,
    REDIS_CONF
}

复制代码

// 添加db文件夹,咱们添加一个mysql模块的一个文件,来管理咱们的链接数据库

mysql 模块

const mysql = require('mysql');
const {MYSQL_CONF} = require('../conf/db');

// 建立 连接对象
const con = mysql.createConnection({
    ...MYSQL_CONF
});

// 开始连接
con.connect();

// 添加执行 sql 函数
function exec(sql) {
    return new Promise((resolve,reject)=>{
        con.query(sql,(err,result)=>{
            if (err) {
                reject(err);
                return
            }
            resolve(result)
        })
    })
}

module.exports = {
    exec,
    escape: mysql.escape
}

复制代码

最后

能看到最后🙏谢谢你们了,多多点赞在github 上面对❤️是对我最好对鼓励,我会尽可能分享一些本身使用得心得以及正确对食用方式

可能如今小伙伴仍是不懂。。俗话说;师傅领进门,修行在我的。代码上的备注写的也够多了。仍是不懂的能够加群问问小伙伴们,

求靠谱内推(北京地区)能够留言我 +。=

相关文章
相关标签/搜索