Koa2——中間件


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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM