首页 > 语言 > JavaScript > 正文

深入解读Node.js中的koa源码

2024-05-06 15:37:53
字体:
来源:转载
供稿:网友

前言

Node.js也是写了两三年的时间了,刚开始学习Node的时候,hello world就是创建一个HttpServer,后来在工作中也是经历过Express、Koa1.x、Koa2.x以及最近还在研究的结合着TypeScript的routing-controllers(驱动依然是Express与Koa)。

用的比较多的还是Koa版本,也是对它的洋葱模型比较感兴趣,所以最近抽出时间来阅读其源码,正好近期可能会对一个Express项目进行重构,将其重构为koa2.x版本的,所以,阅读其源码对于重构也是一种有效的帮助。

Koa是怎么来的

首先需要确定,Koa是什么。

任何一个框架的出现都是为了解决问题,而Koa则是为了更方便的构建http服务而出现的。

可以简单的理解为一个HTTP服务的中间件框架。

使用http模块创建http服务

相信大家在学习Node时,应该都写过类似这样的代码:

const http = require('http')const serverHandler = (request, response) => {response.end('Hello World') // 返回数据}http.createServer(serverHandler).listen(8888, _ => console.log('Server run as http://127.0.0.1:8888'))

一个最简单的示例,脚本运行后访问http://127.0.0.1:8888即可看到一个Hello World的字符串。
但是这仅仅是一个简单的示例,因为我们不管访问什么地址(甚至修改请求的Method),都总是会获取到这个字符串:

> curl http://127.0.0.1:8888> curl http://127.0.0.1:8888/sub> curl -X POST http://127.0.0.1:8888

所以我们可能会在回调中添加逻辑,根据路径、Method来返回给用户对应的数据:

const serverHandler = (request, response) => {// defaultlet responseData = '404'if (request.url === '/') {if (request.method === 'GET') {responseData = 'Hello World'} else if (request.method === 'POST') {responseData = 'Hello World With POST'}} else if (request.url === '/sub') {responseData = 'sub page'}response.end(responseData) // 返回数据}

类似Express的实现

但是这样的写法还会带来另一个问题,如果是一个很大的项目,存在N多的接口。

如果都写在这一个handler里边去,未免太过难以维护。

示例只是简单的针对一个变量进行赋值,但是真实的项目不会有这么简单的逻辑存在的。

所以,我们针对handler进行一次抽象,让我们能够方便的管理路径:

class App {constructor() {this.handlers = {}this.get = this.route.bind(this, 'GET')this.post = this.route.bind(this, 'POST')}route(method, path, handler) {let pathInfo = (this.handlers[path] = this.handlers[path] || {})// register handlerpathInfo[method] = handler}callback() {return (request, response) => {let { url: path, method } = requestthis.handlers[path] && this.handlers[path][method]? this.handlers[path][method](request, response): response.end('404')}}}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选