KOA (破壞式框架)
KOA v1 支持generator
KOA v2 過度版本,支持generator/async
KOA v3 支持async,(未發(fā)布,2018-4-13)
KOA 升級問題,部分中間件不隨KOA升級
KOA 自帶對cookie的控制,不帶對session的控制
KOA 強(qiáng)依賴router
//koa安裝
//koa(主文件) koa-static(控制靜態(tài)文件,被koa-static-cache代替) koa-better-body(控制post數(shù)據(jù)) koa-convert(控制不隨koa升級的中間件) koa-router(路由)
//koa-mysql(未更新,被mysql-pro代替) koa-pug koa-ejs
cnpm i koa koa-static koa-better-body koa-convert koa-router -D
//koa使用--創(chuàng)建服務(wù)器(koa)與使用路由(koa-router)
const koa = require('koa');
const router = require('koa-router');
let server = new koa();
server.listen(8087);
//KOA 強(qiáng)依賴router 必須使用路由
let r1 = router();//koa-router
server.use(r1.routes());//調(diào)用路由必須使用routes()函數(shù)
//r1路由有g(shù)et\post\put\delete等等等等函數(shù),koa3的路由函數(shù)中回調(diào)函數(shù)為async函數(shù),koa1為function函數(shù)
r1.get('/a',async (ctx,next)=>{
//ctx中有node原生屬性跟koa封裝的屬性
//ctx.req node原生的
//ctx.request koa封裝的
//ctx.res
//ctx.response
console.log(ctx);
ctx.response.body={a:12,b:33};//使用響應(yīng)體,直接向瀏覽器返回內(nèi)容
ctx.response.set('header','aaaaa');//設(shè)置特定的響應(yīng)頭
ctx.response.status=403;//設(shè)置響應(yīng)碼
console.log(ctx.request.headers);//獲取求情頭request里有method,url,header,query等屬性
});
//koa使用--靜態(tài)文件(koa-static),(koa-static-cache)
//koa-static缺點(diǎn),會將文件原樣發(fā)送,而不是進(jìn)行壓縮,所以使用koa-static-cache代替,koa-static-cache會進(jìn)行壓縮與緩存
const koa = require('koa');
//const static = require('koa-static');
const static = require('koa-static-cache');
const pathlib = require('path');//用來將路徑改為絕對路徑,方便日后更新路徑
let server = new koa();
server.listen(8087);
//pathlib.resolve(),絕對路徑污它,參數(shù)可以有多個以逗號分隔,以表示多層文件夾,支持./,../拼苍。例:pathlib.resolve('aa','cc');指向當(dāng)前文件所在的絕對路徑盤符/aa/cc;
server.use(static(pathlib.resolve('www')));//訪問localhost:8087/1.html;就會到絕對路徑下的www文件夾下去找1.html
//koa使用--獲取get數(shù)據(jù)
const koa = require('koa');
const router = require('koa-router')
let server = new koa();
server.listen(8087);
let r1 = router();
server.use(r1.routes());
r1.get('/api/:name',async (ctx)=>{
console.log(ctx.params);//localhost:8087/api/aa;路由參數(shù)獲取,此處獲取{name:'aa'}
console.log(ctx.request.query);//localhost:8087/api/aa?b=555;get方法的參數(shù)獲取url?后面的數(shù)據(jù){b:'555'}
ctx.response.body='aaa';//返回響應(yīng)
})
//koa使用--獲取post數(shù)據(jù)('koa-better-body')--使用convert更新中間件
const koa = require('koa');
const betterBody = require('koa-better-body');
const convert = require('koa-convert');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
//使用convert 來解決koa升級帶來的中間件版本太舊問題
server.use(convert(betterBody({
uploadDir:pathlib.resolve('./upload'),//指定文件上傳后存儲的位置,betterBody默認(rèn)會上傳到系統(tǒng)的C盤臨時文件存放處
keepExtendsions:true,//保持文件擴(kuò)展名
})));
server.use(async ctx=>{
console.log(ctx.request.fields);//獲取普通數(shù)據(jù)+部分文件數(shù)據(jù)信息
console.log(ctx.request.files);//獲取文件數(shù)據(jù),form表單需要開啟<form enctype='multipart/form-data'>;否則會文件上傳失敗;
})
//koa使用--進(jìn)行cookie與session的用法
//cookie
const koa = require('koa');
let server = new koa();
server.listen(8087);
server.use(async (ctx)=>{
console.log(ctx.cookies.get('a'));//獲取前臺發(fā)送的cookie a=12
//向前臺發(fā)送的cookie b=5
ctx.cookies.set('b',5,{
maxAge:86400*1000,//有效時長一天
// domain:'localhost', // 寫cookie所在的域名
// path:'/', // 寫cookie所在的路徑
// maxAge: 2*60*60*1000, // cookie有效時長
// expires:new Date('2018-02-08'), // cookie失效時間
// httpOnly:false, // 是否只用于http請求中獲取
// overwrite:false // 是否允許重寫
});
ctx.response.body='a'
})
//session
const koa = require('koa');
const koaSeeion = require('koa-session');
let server = new koa();
server.listen(8087);
server.keys=['key1','key2','key3'];//滾動密鑰,koa強(qiáng)制使用秘鑰,增強(qiáng)安全性,通常將這個key放到一個單獨(dú)的文件中使用模塊拋出,此處引入模塊以保證安全性
server.use(koaSeeion({},server));//koa-session使用需要將server實例發(fā)給koaSession,哎,這就很煩践啄。
server.use(async (ctx)=>{
if(ctx.session['count']){
ctx.session['count']++;//設(shè)置session中的count,發(fā)送給瀏覽器
}
console.log(ctx.session['count']);//獲取session中的count
});
//koa使用pug,語法同4-10筆記pug
const koa = require('koa');
const Pug = require('koa-pug');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
let pug = new Pug({//舒適化pug
viewPath:pathlib.resolve('template/pug'),//存放文件的路徑
app:server,//使用服務(wù)器
});
server.use(async ctx=>{
await ctx.render('1',{a:12})//模板文件以及模板使用數(shù)據(jù);
})
//koa使用ejs,語法同4-10筆記ejs
const koa = require('koa');
const Ejs = require('koa-ejs');
const pathlib = require('path');
let server = new koa();
server.listen(8087);
Ejs(server,{
root:pathlib.resolve('template/ejs'),
layout:false,
viewExt:'ejs'//模板文件后綴名
})
server.use(async ctx=>{
await ctx.render('1',{a:12,name:'blue'})//模板文件以及模板使用數(shù)據(jù);
})
//koa使用數(shù)據(jù)庫(koa-mysql,見4-14)
擴(kuò)展
form表單,文件上傳
form表單上傳文件數(shù)據(jù)時需要開啟<form enctype='multipart/form-data'>;否則會文件上傳失敗