Koa.js學習筆記

一、簡單的小示例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 }));

參考自阮一峯的網絡日誌異步

相關文章
相關標籤/搜索