Node.js 的 Web 框架的 3 个层次,理清了就不迷茫

开发 前端
web 框架指的是处理 http、https 的服务端框架,Node.js 提供了 http、https 模块用于处理协议数据,这是 web 框架的基础。

[[427103]]

 web 框架指的是处理 http、https 的服务端框架,Node.js 提供了 http、https 模块用于处理协议数据,这是 web 框架的基础。

但是 http、https 的 api 过于简单,用起来比较麻烦,所以一般会用 express、koa、fastify 这种封装了一层的框架来简化。

但 express 类的框架不提供代码架构方面的限制,所以对于模块比较多比较复杂的企业级应用来说并不适合,这时就要用实现了 MVC 的 eggjs、nestjs 这类企业级 web 框架。

这是 web 框架的 3 个层次,理清了它们的关系和适用场景,再去学习才不会迷茫。

下面我们分别来看一下:

http、https

http 是基于 TCP 的,对 TCP 传过来的 http 协议数据做 parse,传给 handler 处理,handler 处理完要返回 http 响应,这是 http 模块做的事情。

  1. const http = require('http'); 
  2.  
  3. const server = http.createServer((req, res) => { 
  4.   res.writeHead(200, { 'Content-Type''text/plain' }); 
  5.   res.end('okay'); 
  6. }); 
  7.  
  8. server.listen(8080, '127.0.0.1'); 

http 模块虽然能处理请求和响应,但是提供的 api 过于原始:

比如获取请求参数还要用 url 模块 parse 一次

  1. const http = require('http'); 
  2. const url = require('url'); 
  3.  
  4. http.createServer(function (req, res) { 
  5.   const queryObject = url.parse(req.url,true).query; 
  6.   console.log(queryObject); 
  7.  
  8.   res.writeHead(200, {'Content-Type''text/html'}); 
  9.   res.end('xxx'); 
  10. }).listen(8080); 

比如返回响应只能用 write 或者 end 返回一段 buffer 或 string,想返回 JSON、文件下载、html 视图等都要自己实现。

而且 get、post、put、delete 等请求类型也要自己做判断。

  1. if(req.method === 'get') { 
  2.     //... 
  3. else if (req.method === 'post') { 
  4.     //... 
  5. //... 

因为有这些痛点,所以一般我们不会直接用 http 模块,而是用封装了一层的 express、koa、fastify 这类 web 框架。

express、koa、fastify 等

express 这类框架解决了刚才的那个痛点问题:

  • 提供了路由机制,不用自己手动判断 method 和 path
  1. app.get('/list'function (req, res) { 
  2.   //... 
  3. }) 
  4. app.post('/save'function(req, res) { 
  5.   //... 
  6. }) 
  • 提供了更好用的 request 和 response api:

比如 req.params 获取请求参数

  1. app.get('/user/:id'function (req, res) { 
  2.   res.send('user ' + req.params.id) 
  3. }) 

res.download 返回下载的响应

  1. res.download('/report-12345.pdf'

res.render 返回模版引擎渲染的 html

  1. app.render('xxx-template', { name'guang' }, function (err, html) { 
  2.   // ... 
  3. }) 
  • 提供了中间件机制,用于复用一些一些逻辑:

比如文件上传中间件

  1. app.use(fileUpload({ 
  2.     useTempFiles : true
  3.     tempFileDir : '/tmp/' 
  4. })); 

提供了这么多方便的功能,确实比 http 模块用起来简单多了。

但是 express 类的 web 框架也有问题,就是没有提供组织代码的模式,当模块多了代码很容易乱掉,因为它只是按照类似洋葱的顺序调用中间件,没有模块和 MVC 的划分。

express 类框架做一些小的服务可以,企业级应用还得用 nestjs、eggjs 这类 MVC 框架。

nestjs、eggjs、midwayjs、daruk 等

nestjs 类的框架就实现了 MVC 的模式,代码有明显的 Controller、Service、Model、View 的划分:

  1. import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'
  2. import { CreateUserDto } from './dto/create-user.dto'
  3. import { User } from './user.entity'
  4. import { UsersService } from './users.service'
  5.  
  6. @Controller('users'
  7. export class UsersController { 
  8.   constructor(private readonly usersService: UsersService) {} 
  9.  
  10.   @Post() 
  11.   create(@Body() createUserDto: CreateUserDto): Promise<User> { 
  12.     return this.usersService.create(createUserDto); 
  13.   } 
  14.  
  15.   @Get() 
  16.   findAll(): Promise<User[]> { 
  17.     return this.usersService.findAll(); 
  18.   } 
  19.  
  20.   @Get(':id'
  21.   findOne(@Param('id') id: string): Promise<User> { 
  22.     return this.usersService.findOne(id); 
  23.   } 
  24.  
  25.   @Delete(':id'
  26.   remove(@Param('id') id: string): Promise<void> { 
  27.     return this.usersService.remove(id); 
  28.   } 

nestjs 是对标 java 的 spring 的,实现了 IOC、AOP 等模式,模块之间耦合度很低,就算再复杂的项目,通过 Module、Controller、Service 等也可以很好的被组织起来,相比 express 来说,组织代码方面提升了一个档次。

nestjs 的底层就是 express、fastify 等 web 框架,而且还可以灵活的切换底层实现。

可以看到,nestjs、eggjs 类的企业级框架,除了有丰富的 api 以外,更重要的是提供了代码组织的规范,通过 Module、Controller、Service 等概念可以很好的组织复杂的业务逻辑。

总结

web 框架都是基于 http、https 模块,但它提供的 api 过于原始,使用起来比较麻烦,所以我们一般会用 express、koa 这类框架来简化,它提供了中间件机制来复用逻辑,提供了更多的 request、response 的 api,但却没有组织复杂代码的能力,对于企业级的复杂应用,还是会用 nestjs、eggjs 这类 MVC 框架,它们的底层是 express、koa,但提供了 Module、Controller、Service 等概念,可以很好的组织复杂的代码。

要理清楚为什么会有这三个层次,都各自适合什么场景,这样才能更好的掌握它们,在技术选型上才不会迷茫。

 

责任编辑:武晓燕 来源: 神光的编程秘籍
相关推荐

2019-08-29 10:58:02

Web 开发框架

2020-05-29 15:33:28

Node.js框架JavaScript

2020-07-15 08:06:04

Node.js框架开发

2012-03-07 14:32:41

Node.js

2019-08-05 09:45:19

Node.jsWeb开发前端

2020-04-20 16:00:05

Node.js框架JavaScript

2017-06-15 16:44:09

Node.js框架Web 应用

2022-04-24 15:15:57

前端技术阿里

2020-08-07 10:40:56

Node.jsexpress前端

2020-12-28 19:13:11

Node.js后端框架

2020-07-07 14:07:52

Node.js框架开发

2024-02-01 12:12:01

2022-05-23 10:26:50

Node.jsJavaScrip

2021-12-28 20:04:23

Node.js开发JavaScript

2022-01-07 08:00:00

Node.js开发Web

2020-02-25 12:27:59

Node.jsWeb开发前端

2012-02-03 09:25:39

Node.js

2012-01-10 10:04:43

Node.js

2014-10-30 10:28:55

Node.js

2021-12-25 22:29:57

Node.js 微任务处理事件循环
点赞
收藏

51CTO技术栈公众号