koa服务器(koa框架)
express & koa 框架对比及原理分析
本文将深入剖析Node.js的两款优秀框架express与koa的原理与对比。假设读者对此框架有所了解并能简单使用。
express中的中间件注册:在启动一个express服务器时,会使用一个中间件函数,该函数能够访问请求对象(req)、响应对象(res)和应用程序的请求/响应循环中的下一个中间件函数(next)。通过调用next()将控制权转移到下一个中间件函数。
express应用的创建:通过require("express")得到一个函数,调用该函数创建应用实例。在应用实例中,初始化中间件和路由规则。
中间件注册流程:使用app.use()方法注册中间件,通过this.lazyrouter()初始化全局路由,然后使用router.use(path, fn)将中间件注册到特定路径或全局路径中。
路由处理:app[method]()方法为路径初始化路由实例,并执行相应的处理逻辑。通过router.use(path, fn)方法,中间件被注册到特定路由中。
中间件执行:当用户发起请求时,express内部调用app.handle()执行中间件。在router.handle()方法中,根据路径匹配层,执行中间件函数。普通层执行注册的中间件,路由层执行Route.prototype.dispatch()方法,该方法本质上也是一个中间件,用于处理请求。
Koa框架对比:Koa是一个更轻量级的框架,核心也是中间件。与express相比,Koa在中间件注册和执行上更为简单,不进行复杂的层封装和路由区分。中间件数组中的函数通过koa-compose库进行组合,以递归方式调用下一个中间件。
express与Koa的区别:express提供更全面的Web框架功能,包括参数解析、路由匹配等。Koa则更简洁,需要通过第三方库扩展额外功能。针对异步代码,Koa能够更自然地处理await关键字与中间件结合的问题,而express则需要额外的封装。
Koa的异步中间件处理:在Koa中,中间件参数的next函数返回的Promise,使得可以使用await关键字等待下一个异步中间件的执行。这是由于Koa对next函数进行了特殊的处理,使得其返回值可以被await操作解析。
nest.js和koa有什么不一样
在Node.js环境中,构建服务器最终都会调用原生的http模块,以简单的示例服务器为例,通过http.createServer创建一个server对象,并使用listen函数启动,类似于Java的servlet流程:请求、处理、响应。
Koa实际上是对原生http模块进行了简单封装,引入了中间件机制,以及洋葱模型的调用顺序。Koa提供了四个文件:application.js,context.js,request.js,response.js,共计约2000行代码。application.js导出了一个Application类,其他文件导出的都是原型对象。在实际开发中,使用社区的中间件如@koa/router处理路由,koa-bodyparser解析json请求体,@koa/multer处理multipart表单,@koa/cors处理跨域,joi进行参数校验,jsonwebtoken进行JWT认证,以及自己封装的中间件如处理全局异常。通常,为了简化配置,会使用一些开源工具,如ORM工具sequelize,mongoose,测试工具supertest,powerassert等。
Nest是一个真正的Node.js服务端框架,它提供了构建服务器所需的一切,只需要遵循其模式使用对应的module即可。
在讨论Koa和Nest的区别时,有人认为使用Nest的装饰器比使用Egg的controller简化很多,这是因为JavaScript和TypeScript语言之间的差异。虽然JavaScript也支持装饰器,但现有JavaScript服务器框架中采用装饰器进行依赖注入的实例较少。TypeScript引入了装饰器特性,可以实现依赖注入,提升代码组织和维护效率。
个人认为,Egg如果使用TypeScript重写,将难以超越Nest。虽然TypeScript提供静态类型检查,有助于减少错误,但其与动态特性如装饰器的结合可能带来代码组织上的复杂性。Nest以模块化方式组织代码,每个实体相关文件放在一个文件夹中,与Angular的组件模式类似。然而,Nest的创新点尚不明显,可能缺乏独特的特色,且底层依赖于Express和Fastify,从长远看可能会受到限制。
Nest的中文文档翻译水平需要提高,Egg和Vue的成功部分归功于其地道的中文文档。在构建服务器框架时,考虑到使用场景、语言特性和文档支持,选择合适的工具和技术栈至关重要。
Node.js——koa开发web服务器
一. Koa初体验
学习了express后,Koa成为一个流行且功能强大的Node Web服务器框架。Koa由同一团队开发,旨在提供简洁且高效的代码。
在Koa中,中间件注册提供了两个参数。通过创建的app对象,中间件只能通过use方法进行注册。然而,在真实开发中,如何将路径和method分离?
方式一:根据request自行判断,但逻辑复杂混乱,真实开发中通常采用路由。
二.路由的使用
尽管Koa官方未提供路由库,但可以利用第三方库koa-router进行操作。
1.3.1.安装koa-router
作为第三方库,需要单独安装在项目中。
1.3.2. koa-router基本使用
首先封装一个user.router.js文件,将router.routes()注册为中间件。注意,allowedMethods用于判断特定method是否支持。
1.3.3. router的前缀
为一组相似路径封装路由时,通常会添加前缀,以便在创建Router时直接指定。
三.请求解析
客户端传递到服务器的参数通常有5种常见方式:params、query、json、x-www-form-urlencoded和form-data。
1.4.1.方式一:params
请求地址:。获取params。
1.4.2.方式二:query
请求地址:。获取query。
1.4.3.方式三:json
请求地址:。body为json格式。获取json数据。
1.4.4.方式四:x-www-form-urlencoded
请求地址:。body为x-www-form-urlencoded格式。获取json数据。
1.4.5.方式五:form-data
请求地址:。body为form-data格式。解析body数据需要使用multer,multer还可实现文件上传。
四.响应方式
输出结果为body,可通过设置response.status自动调整状态为200或204。常见的输出方式包括直接设置ctx.response.body或ctx.body。
疑惑:ctx.response.body和ctx.body之间的区别。image-20201104155927483显示了请求状态:status。status可通过ctx或ctx.response直接设置。
五.错误处理
详细解析请参考视频,源码解析部分不再截图。
二.和express对比
学习了两个框架后,可以发现Koa与express的区别在于架构设计。两者的核心都是中间件,Koa提供更简洁的开发体验。
2.1.同步执行顺序
假设所有数据同步获取,使用express和Koa实现结果相同:aaabbbccc。
2.2.异步执行顺序
若最后的数据需要异步操作,Koa处理异步操作更为合理,最终结果为aaabbb+歌词信息,而express则可能导致错误结果aaabbb。