koa中间件原理

之前有写过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的核心

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本节将结合例子和源码对koa2的中间件机制做一介绍。 什么是中间件? 中间件的本质就是一种在特定场景下使用的函数,...
    空无一码阅读 1,477评论 0 2
  • 阅读这篇文章,你不需要听过 koa 框架,你甚至不需要使用过 node,你只需简单看懂 js。相信每一个具有 we...
    大前端艺术家阅读 1,488评论 0 4
  • Node 主要用在开发 Web 应用,koa 是目前 node 里最流行的 web 框架。 在 Node 开启一个...
    中间件阅读 527评论 0 1
  • 一、背景 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 ...
    bayi_lzp阅读 10,753评论 6 26
  • 晚上十点,周拿出钥匙,打开门,屋内漆黑一片,他摸黑开了灯,脱掉衣服和鞋袜,摘下面具,释放被束缚了一天的身体。 屋内...
    虚空恒乐阅读 434评论 3 14