成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

2012-03-07 14:32:41

Node.js

2020-07-15 08:06:04

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

2020-02-25 12:27:59

Node.jsWeb開發前端

2022-01-07 08:00:00

Node.js開發Web

2012-02-03 09:25:39

Node.js

2015-06-02 13:37:13

Node.jsWeb

2012-01-10 10:04:43

Node.js

2014-10-30 10:28:55

Node.js
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩免费网站 | 国产精品欧美一区二区三区不卡 | 日韩中字幕 | 99久久99热这里只有精品 | 亚洲av一级毛片 | 亚洲精品www久久久久久广东 | 久久日韩精品一区二区三区 | 精品福利一区二区三区 | 亚洲成人综合在线 | 久久亚洲91| 精品一区二区三区在线观看 | 一区二区亚洲 | 日韩高清电影 | 成人h视频在线观看 | 国产精品久久福利 | 久久久久久国产精品免费 | 日韩精品久久久久 | 久久精品99国产精品 | 91精品在线看 | www97影院| h片在线播放 | 亚洲综合在线一区二区 | 日韩美香港a一级毛片免费 国产综合av | 一区二区电影 | 日韩欧美不卡 | 久久中文免费视频 | 国产精品精品久久久 | 色www精品视频在线观看 | 欧美成人一区二区三区 | 一区二区国产在线观看 | 国产成人免费在线 | 国产精品久久久久久 | 欧美极品在线观看 | 成人国产精品久久久 | 亚洲乱码一区二区三区在线观看 | 亚洲播放 | 在线免费黄色小视频 | 国产高清在线精品 | 午夜三区 | 一级黄色片网址 | 国产a视频 |