1.什么是koa2中間件?
koa對網絡請求采用了中間件的形式處理,中間件可以介入請求和相應的處理,是一個輕量級的模塊,每個中間負責完成某個特定的功能。中間件的通過next函數聯系,執行next()后會將控制權交給下一個中間件,如果沒有有中間件沒有執行next后將會沿路折返,將控制權交換給前一個中間件。

當執行app.listen方法開啟服務器時,實際上是在內部,使用http模塊,啟動了http服務器,並將自身的callback函數傳入
二、常用的五個中間件
1.koa:面向node.js的表達式HTTP中間件框架,使Web應用程序和API更加令人愉快地編寫。Koa的中間件堆棧以類似堆棧的方式流動,允許您執行下游操作,然后過濾和處理上游的響應。
var Koa = require('koa'); var app = new Koa(); // response app.use(ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
2.koa-router:Router middleware for koa(koa的路由中間件)
const Koa = require('koa'); const Router=require('koa-router'); const app = new Koa(); const router=new Router(); router.get('/',function(ctx,next){ ctx.body='hello hello'; }) app.use(router.routes()); app.listen(3000);
3.koa-views:Template rendering middleware for koa.(koa的模板渲染中間件)
ctx:為網絡處理上下文,next指向下個中間件
swig:http://www.jianshu.com/p/f0bffc42c1ce
const Koa=require('koa'); const views=require('koa-views'); const app=new Koa(); //配置模板解析器 app.use(views(__dirname+'/views',{ map:{ html:'swig' } })); app.use(async function(ctx,next){ await ctx.render('layout'); }) app.listen(3000);
4.koa-bodyparser:用來解析body的中間件,比方說你通過post來傳遞表單,json數據,或者上傳文件,在koa中是不容易獲取的,通過koa-bodyparser解析之后,在koa中this.body就能直接獲取到數據。ps:xml數據沒辦法通過koa-bodyparser解析,有另一個中間件koa-xml-body。
var Koa = require('koa'); var bodyParser = require('koa-bodyparser'); var app = new Koa(); app.use(bodyparser({ enableTypes:['json', 'form', 'text'] })); app.use(async ctx => { ctx.body = ctx.request.body; }); app.listen(3000);
5.promise-mysql:Promise-mysql是mysqljs / mysql的一個包裝函數,它包含Bluebird承諾的函數調用。通常這會用Bluebird的.promisifyAll()方法完成,但是mysqljs / mysql的腳本與Bluebird所期望的不同。
對於重復的代碼我們將它封裝在一起,方便使用,提高代碼的重用性,DbUtil.js
var mysql=require('promise-mysql'); var Promise=require('bluebird'); pool = mysql.createPool({ host: '192.168.22.2', user: 'root', password: 'root', database: 'music', connectionLimit: 2 });//此處可根據實際情況更改 function getSqlConnection() { return pool.getConnection().disposer(function(connection) { pool.releaseConnection(connection); }); } async function execSql(sql){ let result=null; await Promise.using(getSqlConnection(), function(connection) { return connection.query(sql) .then(function(rows) { result=rows; }).catch(function(error) { console.log(error); }); }) return result; } module.exports = execSql;
var execSql=require('./DbUtil.js'); function SingerDb(){ } SingerDb.prototype.querySinger=async function(){ let sql='select * from singer'; return execSql(sql); } SingerDb.prototype.querySingers=async function(){ let sql='select id,name from singer'; return execSql(sql); } SingerDb.prototype.addSinger=async function(singer){ let sql=`insert into singer (name,englishname,guoji,chushengdi,jobs,picName) values ('${singer.name}','${singer.englishname}','${singer.guoji}','${singer.chushengdi}','${singer.jobs}','${singer.picName}')`; // execSql(sql).then(function(rows){ // return rows; // }); return execSql(sql); } SingerDb.prototype.delSinger=async function(id){ let sql=`delete from singer where id=${id}`; return execSql(sql); } SingerDb.prototype.querySingerById=async function(id){ let sql=`select * from singer where id=${id}`; return execSql(sql); } SingerDb.prototype.updateSinger=async function(singer){ let sql=`update singer set name='${singer.name}' where id=${singer.id}`; return execSql(sql); } // let singer={ // name:'張靚穎', // englishname:'amanda', // guoji:'中國', // chushengdi:'中國湖南', // jobs:'歌手' // } // new SingerDb().addSinger(singer); // new SingerDb().querySinger(); module.exports=new SingerDb();
