1、安裝 koaphp
npm install koa --save
2、簡單使用html
const koa = require('koa'); //注意使用koa須要new,跟express有點不一樣 let app = new koa(); app.listen(8888); //use()方法將中間件加入應用中 app.use(async function (ctx, next) { //ctx.res 原生res //ctx.req 原生req //ctx.request 被koa包裝過的req對象 //ctx.response 被koa包裝過的res對象 ctx.response.body = 'ok'; }); //發生錯誤時觸發 app.on('error', function (err) { console.log(err); });
3、級聯中間件的概念express
const koa = require('koa'); let app = new koa(); app.listen(8888); app.use(async function (ctx, next) { console.log('1'); await next(); console.log('2'); }); app.use(async function (ctx, next) { console.log('3'); await next(); console.log('4'); }); app.use(async function (ctx, next) { console.log('5'); });
上述代碼最終會打印出 1 3 5 4 2,koa中間件裏的 await next() 以前的代碼會一級一級向下執行,直到沒有更多中間件執行,而後再像棧同樣的執行 await next() 以後的代碼。npm
4、獲取get請求參數緩存
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); let route = new router(); app.listen(8888); route.get('/:id', function (ctx, next) { //獲取請求方法 console.log(ctx.method); //獲取請求URL console.log(ctx.url); //獲取請求路徑 console.log(ctx.path); //獲取請求查詢字符串對象 console.log(ctx.query); //獲取請求查詢字符串 console.log(ctx.querystring); //獲取路由參數 console.log(ctx.params); //獲取請求頭對象 console.log(ctx.headers); }); app.use(route.routes());
5、獲取post表單數據和文件上傳cookie
安裝 koa-better-body 用於解析session
npm install koa-better-body --save npm install koa-convert --save
注意使用 koa-better-body 須要用 koa-convert 轉換一下。app
const fs = require('fs'); const path = require('path'); const koa = require('koa'); const router = require('koa-router'); const betterBody = require('koa-better-body'); const convert = require('koa-convert'); let app = new koa(); let route = new router(); app.listen(8888); //使用koa-better-body須要用koa-convert轉一下 app.use(convert(betterBody({ //指定上傳的目錄 uploadDir: path.join(__dirname, 'uploads'), //是否保留擴展名 keepExtensions: true, //設置上傳文件大小最大限制,默認2M maxFileSize: 1024 * 1024 * 1024 }))); route.get('/', function (ctx, next) { ctx.response.set('Content-Type', 'text/html;charset=utf-8'); ctx.body = fs.readFileSync('./index.html'); }); route.post('/post', function (ctx, next) { //post表單數據 console.log(ctx.request.fields); //上傳文件的詳細信息 console.log(ctx.request.files); }); app.use(route.routes());
index.html的代碼:dom
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表單</title> </head> <body> <form action="http://localhost:8888/post" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="name"><br> 密碼:<input type="password" name="pwd"><br> 頭像:<input type="file" name="head"><br> 信息1:<input type="file" name="info"><br> 信息2:<input type="file" name="info"><br> <input type="submit" name="提交"> </form> </body> </html>
6、路由中間件 koa-routerkoa
npm install koa-router --save
路由是能夠設置多級的,能夠嵌套。方便咱們自由拆分。
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); app.listen(8888); let users = new router(); let order = new router(); users.get('/', function (ctx) { ctx.body = '用戶頁面'; }); users.get('/add', function (ctx) { ctx.body = '用戶添加頁面'; }); order.get('/', function (ctx) { ctx.body = '訂單頁面'; }); order.get('/add', function (ctx) { ctx.body = '訂單添加頁面'; }); let route = new router(); route.use('/users', users.routes()); route.use('/order', order.routes()); app.use(route.routes());
7、cookie的設置與讀取
koa中能夠直接經過 ctx.cookies.set() 或 ctx.cookies.get() 進行設置和獲取cookie
const koa = require('koa'); const router = require('koa-router'); let app = new koa(); app.listen(8888); //設置cookie簽名加密時,須要配置密鑰 app.keys = [ '2dsfjo3rt3pt934rjh2' ]; let route = new router(); route.get('/', function (ctx, next) { //參數一表示,cookie名稱 //參數二表示,cookie的值 //參數三表示,cookie的配置選項 ctx.cookies.set('test', 'test', { //cookie所在的域名 domain: 'localhost', //cookie所在的路徑 path: '/', //有效時間,單位毫秒 maxAge: 3600 * 1000, //失效時間 expires: new Date(Date.now() + 3600 * 1000), //是否只能在http中獲取 httpOnly: true, //是否容許重寫 overwrite: true }); //設置cookie是否簽名加密,若是設置簽名加密,需配置app.keys ctx.cookies.set('name', 'xiaoxu', {signed: true}); //獲取cookie console.log(ctx.cookies.get('test')); console.log(ctx.cookies.get('name')); }); app.use(route.routes());
8、session的使用
安裝 koa-session 中間件
npm install koa-session --save
koa-session默認會話是基於cookie實現的,固然會話信息也能夠保存到其它地方。
const koa = require('koa'); const router = require('koa-router'); const session = require('koa-session'); let app = new koa(); app.listen(8888); //設置簽名加密的密鑰 app.keys = [ 'rj345jptjgadsfjeasltrg' ]; let route = new router(); //使用koa-session中間件 app.use(session({ //cookie的名稱 key: 'session', //有效時間 maxAge: 3600 * 1000, //是否自動提交頭信息 autoCommit: true, //是否充許重寫 overwrite: true, //是否只能http獲取 httpOnly: true, //是否簽名加密 signed: true }, app)); route.get('/', function (ctx, next) { if (ctx.session.count) { ++ctx.session.count; } else { ctx.session.count = 1; } ctx.body = `您是第 ${ctx.session.count} 次訪問`; }); app.use(route.routes());
9、模板引擎ejs的使用
npm install koa-ejs --save
經過ejs模板引擎,咱們能夠很方便的渲染頁面。
const path = require('path'); const koa = require('koa'); const router = require('koa-router'); const ejs = require('koa-ejs'); let app = new koa(); app.listen(8888); let route = new router(); //模板引擎配置 ejs(app, { //模板目錄 root: path.join(__dirname, 'views'), //佈局文件 layout: false, //模板擴展名 viewExt: 'html', //是否開啓緩存 cache: false, //是否開啓調試信息 debug: true }); route.get('/', async function (ctx, next) { await ctx.render('index', { name: 'xiaoxu', age: 24 }); }); app.use(route.routes());
10、靜態資源中間件
咱們使用 koa-static-cache 這個中間件。
npm install koa-static-cache --save
使用 koa-static-cache 幫咱們處理靜態資源
const path = require('path'); const koa = require('koa'); const static = require('koa-static-cache'); let app = new koa(); app.listen(8888); //使用中間件,並配置靜態資源目錄 app.use(static(path.join(__dirname, 'public'), { //是否壓縮文件 gzip: true, //緩存有效時間 maxAge: 60 }));