一、簡單的小示例html
const Koa=require('koa'); //引入Koa.js const app=new Koa(); //實例化Koa對象 const main=ctx=>{ //main函數用來設置ctx.response.body ctx.response.body='Hello World'; //context.response.body就是發給用戶的消息 } app.use(main); //加載main函數 app.listen(3000); //建立服務器並監聽3000端口
二、HTTP Response 的類型json
//Koa 默認的返回類型是text/plain,若是想返回其餘類型的內容,能夠先用ctx.request.accepts判斷一下,客戶端但願接受什麼數據(根據 HTTP Request 的Accept字段),而後使用ctx.response.type指定返回類型 const Koa=require('koa'); const app=new Koa(); const main=ctx=>{ if(ctx.require.accepts('xml')){ ctx.response.type='xml'; ctx.response.body='<data>Hello</data>' }else if(ctx.require.accepts('json')){ ctx.response.type='json'; ctx.response.body={data:'Hello'}; }else if(ctx.require.accepts('html')){ ctx.response.type='html'; ctx.response.body='<p>Hello</p>' }else{ ctx.response.type='text'; ctx.response.body='Hello'; } } app.use(main); app.listen(3000);
三、路由(封裝好的 koa-route模塊)promise
const Koa=require('koa'); const app=new Koa(); const route=require('koa-route'); const about=ctx=>{ ctx.response.type='html'; //給客戶端發送的消息類型是html ctx.response.body='<a href='/'>去首頁</a>' //發送的內容 } const main=ctx=>{ ctx.response.type='html'; ctx.response.body='<p>我是首頁</p>' } app.use(route.get('/',main)); //當客戶端訪問根路徑時,返回main函數 app.use(route.get('/about',about)); app.listen(3000);
四、 靜態資源服務器
//若是網站提供靜態資源(圖片、字體、樣式表、腳本......),沒必要爲它們一個個寫路由,koa-static模塊封裝了這部分的請求 const path=require('path'); const serve=require('koa-static'); const main=serve(path.join(__dirname)); app.use(main);
五、重定向cookie
//有些場合,服務器須要重定向(redirect)訪問請求。好比,用戶登錄之後,將他重定向到登錄前的頁面。ctx.response.redirect()方法能夠發出一個 302 跳轉,將用戶導向另外一個路由。 const Koa=require('koa'); const app=new Koa(); const route=require('koa-route'); const redirect=ctx=>{ ctx.response.redirect('/'); //將用戶重定向到首頁 } const main=ctx=>{ ctx.response.type='html'; ctx.response.body='<a href='/'>首頁</a>'; } app.use(route.get('/redirect',redirect)); app.use(route.get('/',main)); app.use(main); app.listen(3000);
六、中間件網絡
一、打印日誌(Logger功能): const main=ctx=>{ cxt.response.body='Hello'; console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`) //1502144902843 GET / } 二、什麼是中間件? //基本上,Koa 全部的功能都是經過中間件實現的。 //代碼中的logger、main函數就叫作中間件(middleware),由於它處在 HTTP Request 和 HTTP Response 中間,用來實現某種中間功能。app.use()用來加載中間件 //每一箇中間件默認接受兩個參數,第一個參數是 Context 對象,第二個參數是next函數。只要調用next函數,就能夠把執行權轉交給下一個中間件 const logger=(ctx,next)=>{ console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`) } const main=ctx=>{ ctx.response.body='<p>Hello</p>'; } app.use(logger); app.use(main); app.listen(3000); 三、異步中間件 const fs=require('fs.promised'); const Koa=require('koa'); const app=new Koa(); const main=async function(ctx,next){ //async表示該函數時異步函數(ES6語法) ctx.response.type='html'; ctx.response.body=await fs.readFile('./demos/template.html','utf8') } app.use(main); app.listen(3000); 四、中間件的合成 //koa-compose模塊能夠將多箇中間件合成爲一個 const Koa=require('koa'); const app=new Koa(); const compose=require('koa-compose'); const logger=(ctx,next)=>{ console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`); next() } const main=ctx=>{ ctx.response.body='Hello'; } const middlewares=compose([logger,main]); app.use(middlewares);
七、錯誤處理app
一、拋出 500錯誤、404錯誤 const main=ctx=>{ ctx.response.status=404; //等同於:ctx.throw(404) ctx.response.body='找不到頁面'; } 二、處理錯誤的中間件 //main函數拋出錯誤,被handler函數捕獲 const handler=async function(ctx,next){ tr{ await next(); }catch(err){ ctx.response.status=err.statusCode||err.status||500; ctx.response.body={ message:err.message } } } const main=ctx=>{ ctx.throw(500); } app.use(handler); app.use(main); 三、error 事件的監聽 //運行過程當中一旦出錯,Koa 會觸發一個error事件。監聽這個事件,也能夠處理錯誤 const main=ctx=>{ ctx.throw(500); } app.on('error',(err,ctx)=>{ console.error('服務器出錯了',err) }) 四、釋放error事件 //若是錯誤被try...catch捕獲,就不會觸發error事件,這時,必須調用ctx.app.emit(),手動釋放error事件,才能讓監聽函數生效 const handler = async (ctx, next) => { try { await next(); } catch (err) { ctx.response.status = err.statusCode || err.status || 500; ctx.response.type = 'html'; ctx.response.body = '<p>Something wrong, please contact administrator.</p>'; ctx.app.emit('error', err, ctx); } }; const main = ctx => { ctx.throw(500); }; app.on('error', function(err) { console.log('logging error ', err.message); console.log(err); });
八、Web App 的功能koa
一、Cookies //ctx.cookies.get('cookieName') 用來讀 Cookie //ctx.cookies.set('cookieName',value) 用來寫Cookie const main=ctx=>{ //你會看到1 views。刷新一次頁面,就變成了2 views const n=Number(ctx.cookies.get('view')||0)+1; ctx.cookies.set('view',n); ctx.response.body=n+'view'; } 二、表單 //koa-body模塊能夠用來從 POST 請求的數據體裏面提取鍵值對 const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); const main = async function(ctx) { const body = ctx.request.body; if (!body.name){ ctx.throw(400, '.name required'); } ctx.body = { name: body.name }; }; app.use(koaBody()); app.use(main); app.listen(3000); 三、文件上傳 const os = require('os'); const path = require('path'); const koaBody = require('koa-body'); const main = async function(ctx) { const tmpdir = os.tmpdir(); const filePaths = []; const files = ctx.request.body.files || {}; for (let key in files) { const file = files[key]; const filePath = path.join(tmpdir, file.name); const reader = fs.createReadStream(file.path); const writer = fs.createWriteStream(filePath); reader.pipe(writer); filePaths.push(filePath); } ctx.body = filePaths; }; app.use(koaBody({ multipart: true }));