koa中间件原理
2019-07-04 本文已影响0人
ysp123
之前有写过koa中间件的简单使用,简单回顾下:
//app.js
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
await next(); // 调用下一个middleware
});
app.use(async (ctx, next) => {
const start = new Date().getTime(); // 当前时间
await next(); // 调用下一个middleware
const ms = new Date().getTime() - start; // 耗费时间
console.log(`Time: ${ms}ms`); // 打印耗费时间
});
app.use(async (ctx, next) => {
await next();
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, koa2!</h1>';
});
app.listen(9091);
运行:
node app.js //访问localhost:9091
以上就是koa中间件的使用,可以看出中间件的执行时通过use注册函数。知道use里执行中间件,构造一个服务,实现http访问。
//server.js
const http = require('http');
class Koa{
createContent(req, res){
const ctx = {
req, res
}
return ctx;
}
callback(){
return (req, res)=>{
const ctx = this.createContent(req, res);
ctx.res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
ctx.res.end("测试http服务");
}
}
listen(port){
const server = http.createServer(this.callback());
server.listen(port);
}
}
module.exports = Koa;
//app.js
const server = require('server.js');
const app = new server();
app.listen(9000);
node app.js //执行app, http访问
服务核心use(中间件注册)
//server.js
const http = require('http');
function compose(middlewares){
return function(){
function dispatch(i){
const fn = middllwares[i];
try{
return Promise.resolve(
fn(ctx, dispatch.bind(null, i+1));
);
}catch(err){
return Promise.reject(err);
}
}
dispatch(0);
}
}
class myKoa{
constructor(){
this.middleware = [];
}
use(fn){
this.middleware.push(fn);
return this;
}
createContent(req, res){
const ctx = {
req, res
}
return ctx;
}
callback(){
return (req, res)=>{
const ctx = this.createContent(req, res);
//ctx.res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
//ctx.res.end("测试http服务");
}
}
listen(port){
const server = http.createServer(this.callback());
server.listen(port);
}
}
module.exports = myKoa;
//app.js
const Iok = require('./myKoa.js');
const app = new Iok();
app.use(async (ctx, next) => {
console.log('lllll');
await next();
ctx.res.end('444444444444');
});
app.use(async (ctx) => {
console.log('222222222222');
ctx.res.end('66666666666666');
});
app.listen(9000);
以上就是实现koa的核心