工作生活node

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的核心

上一篇下一篇

猜你喜欢

热点阅读