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-bodyparse解析,有另一个中间件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();