从零实现一个koa(一)实现一个简易服务器

836 阅读1分钟

功能说明

  • koa是一个新的 web 框架,由 Express 幕后的原班人马打造,单比express更加小巧,额外的功能比如koa-router都通过中间件来实现。

实现目标

  • 实现一个web服务器可以供用户调用。
  • 实现中间件系统即koa中的use,可以供koa安装中间件。

实例展示

const koa = require('koa');
const app = new koa();
app.use(async (ctx, next) => {
    console.log('中间件1 start')
    await next()
    console.log('中间件1 end')
})
app.use(async (ctx, next) => {
    console.log('中间件2 start')
    await next()
    console.log('中间件2 end')
})

koa.bootcss.com/#context

实现web服务器

  • 首先我们通过nodejs的http模块实现一个建议服务器服务器。
const http = require('http');
class Koa{
   constructor(options) {}
   // 实现监听端口号
   listen(...arg) {
       const server = http.createServer(this.callback);
       return server.listen(...arg)
   }
   callback(req,res) {
    console.log(req,res)
    res.end('ok')
   }
}
  • 简易服务器实现好了,我们想啊,万一这个服务中报错了,或者想发出一些消息通知外面怎么办?那么 好了我们想到了nodejs中的event模块。
const http = require('http');
const Emitter = require('events');
class Koa extends Emitter{
   constructor(options) {
     super()
  }
   // 实现监听端口号
   listen(...arg) {
       const server = http.createServer(this.callback);
       return server.listen(...arg)
   }
   callback(req,res) {
    console.log(req,res)
    res.end('ok')
    this.emit('测试消息')
   }
}
const app = new Koa()
app.on('xxx', () => {console.log('接收消息')})

那么现在简易的服务器就实现好了,计划总共三章,下一章我们说下koa中use的实现,这个实现比较有趣一点,和vue的异步队列同步执行有些相似。最后一章说下中间件use参数中的ctx,其实也就是做了属性代理,拿到req,res上的一些属性,做到可以直接访问。