1.koa2 安裝 node mysql 和 redis 安裝方面就不介紹了,建議百度 主要講 安裝以及裏面一些項目的文件呀,而後可讓小夥伴們基本瞭解koa2開發後臺,但願你們能夠學到後臺開發到思想。建議觀看前能夠去github
上先下載源碼而後進行食用,效果更加((QQ羣技術討論)838293023備註(github進來的前端
// 安裝 koa 保證node 版本 8以上mysql
npm install -g koa
nginx
// 安裝腳手架git
npm install -g koa-generator
github
// project 項目名稱redis
koa2 project
sql
cd project
// 安裝依賴數據庫
npm install
express
// 安裝當前 環境變量
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",
koa的路由不是內置在裏面的 咱們須要添加 koa-router
插件 沒有能夠下載一下npm i koa-router --save
咱們先引入 koa-router
而後直接執行 咱們主要介紹 get
和 post
回調值,這有一個async
這個是es7的解決異步的方法(重點) ctx
就是把咱們的request
和response
合起來 並加了本身的一些方法,next
執行後就會繼續執行 ,這邊咱們看到有一個ctx.body = xxx 的方式這個是回調咱們前端數據方式 和 express
的res.json()
是同樣的。
app.js
裏面
koa-json
和
koa-bodyparser
這個是咱們用來接受前端數據而後進行處理的一個依賴
app.use()
)咱們的依賴後咱們就能夠在咱們的router 裏面獲取到前端傳的數據了
// get 獲取
const {author:author="",keyword:keyword=""} = context.query;
複製代碼
// post 獲取
const {author:author="",keyword:keyword=""} = context.request.body;
複製代碼
獲取到數據咱們就能夠進行下一步了
這裏咱們添加了一個對用戶沒有登陸的一個攔截 loginCheck.js
const {ErrorModel} = require('../model/resModel');
module.exports = async (context,next)=>{
if (context.session.username) {
await next()
return
}
context.body = new ErrorModel('用戶暫未登陸')
}
複製代碼
使用方式
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
來獲取和設置 session
和 redis
下面代碼 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
}
複製代碼
使用
咱們對返回前端時候對數據進行一次處理 返回前端的就是一個實例,
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 的配置
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模塊的一個文件,來管理咱們的鏈接數據庫
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 上面對❤️是對我最好對鼓勵,我會盡可能分享一些本身使用得心得以及正確對食用方式
可能如今小夥伴仍是不懂。。俗話說;師傅領進門,修行在我的。代碼上的備註寫的也夠多了。仍是不懂的能夠加羣問問小夥伴們,
求靠譜內推(北京地區)能夠留言我 +。=