「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
手撕koa,从零掌握koa的实现原理(2)
前言
- 回顾昨天的内容,我们了解了官方的
koa的目录,搭建了我们自己的工程结构。
整个工程叫
koa,koa/koa文件夹存放我们自己实现的koa代码,src文件夹存放我们的测试代码。
(图一项目工程结构)
application.js继续实现
koa实际上就是对http模块的一个封装,所以我们需要导入http模块,在实现的过程中我们还需要用到EventEmitter模块(node中自带的发布订阅模块),继承的时候不要忘记调用super。我们先初步实现listen方法,listen方法的主要作用是使用http模块开启一个服务。最后我们导出Application,进行到这一步我们先来测试一下代码能否走通。
-
koa/lib/application.jsconst 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文件。
-
控制台打印
(图二控制台打印)
-
浏览器访问一下
localhost:3000(图三浏览器访问)
今天的实现就到这里,明天继续。
看到这里的兄弟给点个赞吧,万分感谢。
最近也在学习如何搭建自己的博客,博客地址:Roubzi Blog ,目前还在搭建中,希望和大家多交流。
在这个不能停下脚步的时代,即便我们很菜,我们也可以去追求更优秀的自己,以及,所有那些值得去追求的美好事物。
新的一年,祝你,也祝我。