手撕koa,从零掌握koa的实现原理(2)

244 阅读3分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

手撕koa,从零掌握koa的实现原理(2)

前言

手撕koa,从零掌握koa的实现原理(1)

  • 回顾昨天的内容,我们了解了官方的koa的目录,搭建了我们自己的工程结构。

整个工程叫koakoa/koa文件夹存放我们自己实现的koa代码,src文件夹存放我们的测试代码。

2022-01-18-1.png

(图一项目工程结构)

application.js继续实现

koa实际上就是对http模块的一个封装,所以我们需要导入http模块,在实现的过程中我们还需要用到EventEmitter模块(node中自带的发布订阅模块),继承的时候不要忘记调用super。我们先初步实现listen方法,listen方法的主要作用是使用http模块开启一个服务。最后我们导出Application,进行到这一步我们先来测试一下代码能否走通。

  • koa/lib/application.js

    const http = require('http')
    const EventEmitter = require('events')
    class Application extends EventEmitter {
      constructor(){
        super()
      }
      handleRequest = (req, res) => {
        res.statusCode = 200
        //因为我们响应的是中文,所以需要设置一下content-type,否则浏览器会显示乱码
        res.setHeader('content-type','text/plain;charset=utf-8')
        res.end('自己实现的Koa')
      }
      listen(){
        const server = http.createServer(this.handleRequest)
        server.listen(...arguments)
      }
    }
    
    module.exports = Application
    
  • 需要注意的小点

    在实现listen方法的时候,我们把http.createServer的回调函数提取了出去。 那我们的handleRequest方法就需要这样写

    handleRequest = () => {
    
    }
    

    不能这样写

    handleRequest(){
    
    }
    

    否则我们的this指向会出现问题,或者我们listen方法中这样写,使用bind函数改变一下this指向,如果使用了bind,那我们的handleRequest方法就不需要写成箭头函数了,两种写法选择一个就好。

    如果对this的指向不是很了解,推荐文章:深入JS 之 面试官经常问的 THIS 闭包 let\const\var 你会了吗?

    listen(){
      const server = http.createServer(this.handleRequest.bind(this))
      server.listen(...arguments)
    }
    

测试一下我们的Application

做到这一步我们先测试一下我们的服务能否正常开启。

  • koa/src/server.js

    koa/src/server.js中我们开启3000端口,看看我们的代码能否运行成功。

    const Koa = require('../koa')
    const app = new Koa()
    
    app.listen(3000,() => {
      console.log('server start 3000');
    })
    

测试结果

我们使用node跑一下koa/src/server.js文件。

  • 控制台打印

    2022-01-19-1.png (图二控制台打印)

  • 浏览器访问一下localhost:3000

    2022-01-19-2.png (图三浏览器访问)

今天的实现就到这里,明天继续。

看到这里的兄弟给点个赞吧,万分感谢。

最近也在学习如何搭建自己的博客,博客地址:Roubzi Blog ,目前还在搭建中,希望和大家多交流。

在这个不能停下脚步的时代,即便我们很菜,我们也可以去追求更优秀的自己,以及,所有那些值得去追求的美好事物。

新的一年,祝你,也祝我。