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 = newKoa();//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 = newKoa();const router=newRouter();
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=newKoa();//配置模板解析器
app.use(views(__dirname+'/views',{
map:{
html:'swig'}
}));
app.use(asyncfunction(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 = newKoa();
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() {returnpool.getConnection().disposer(function(connection) {
pool.releaseConnection(connection);
});
}asyncfunction execSql(sql){
let result=null;await Promise.using(getSqlConnection(), function(connection) {returnconnection.query(sql)
.then(function(rows) {
result=rows;
}).catch(function(error) {
console.log(error);
});
})returnresult;
}
module.exports= execSql;
var execSql=require('./DbUtil.js');
function SingerDb(){
}
SingerDb.prototype.querySinger=asyncfunction(){
let sql='select * from singer';returnexecSql(sql);
}
SingerDb.prototype.querySingers=asyncfunction(){
let sql='select id,name from singer';returnexecSql(sql);
}
SingerDb.prototype.addSinger=asyncfunction(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;//});
returnexecSql(sql);
}
SingerDb.prototype.delSinger=asyncfunction(id){
let sql=`delete from singer where id=${id}`;returnexecSql(sql);
}
SingerDb.prototype.querySingerById=asyncfunction(id){
let sql=`select * from singer where id=${id}`;returnexecSql(sql);
}
SingerDb.prototype.updateSinger=asyncfunction(singer){
let sql=`update singer set name='${singer.name}' where id=${singer.id}`;returnexecSql(sql);
}//let singer={//name:'张靓颖',//englishname:'amanda',//guoji:'中国',//chushengdi:'中国湖南',//jobs:'歌手'//}//new SingerDb().addSinger(singer);//new SingerDb().querySinger();
module.exports=new SingerDb();