从零实现TypeScript版Koa

这篇文章会讲些什么?

  • 如何从零开始完成一个涵盖Koa核心功能的Node.js类库
  • 从代码层面解释Koa一些代码写法的原因:如中间件为什么必须调用next函数、ctx是怎么来的和一个请求是什么关系

我们知道Koa类库主要有以下几个重要特性:

  • 支持洋葱圈模型的中间件机制
  • 封装request、response提供context对象,方便http操作
  • 异步函数、中间件的错误处理机制

第一步:基础Server运行

目标:完成基础可行新的Koa Server

  • 支持app.listen监听端口启动Server
  • 支持app.use添加类middleware处理函数

核心代码如下:

class Koa {
   
  private middleware: middlewareFn = () => {
   };
  constructor() {
   }
  listen(port: number, cb: noop) {
   
    const server = http.createServer((req, res) => {
   
      this.middleware(req, res);
    });
    return server.listen(port, cb);
  }
  use(middlewareFn: middlewareFn) {
   
    this.middleware = middlewareFn;
    return this;
  }
}

const app = new Koa();
app.use((req, res) => {
   
  res.writeHead(200);
  res.end("A request come in");
});
app.listen(3000, () => {
   
  console.log("Server listen on port 3000");
});

第二步:洋葱圈中间件机制实现

目标:接下来我们要完善listen和use方法,实现洋葱圈中间件模型

[外链图片转存失败(img-qYztqNsK-1568619865571)(./assets/koa_middleware.png)]

如下面代码所示,在这一步中我们希望app.use能够支持添加多个中间件,并且中间件是按照洋葱圈(类似深度递归调用)的方式顺序执行

app.use(async (req, res, next) => {
   
  console.log("middleware 1 start");
  // 具体原因我们会在下面代码实现详细讲解
  await next();
  console.log("middleware 1 end");
});
app.use(async (req, res, next) => {
   
  console.log("middleware 2 start"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值