前端進階 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 上面對❤️是對我最好對鼓勵,我會盡可能分享一些本身使用得心得以及正確對食用方式

可能如今小夥伴仍是不懂。。俗話說;師傅領進門,修行在我的。代碼上的備註寫的也夠多了。仍是不懂的能夠加羣問問小夥伴們,

求靠譜內推(北京地區)能夠留言我 +。=

相關文章
相關標籤/搜索