日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Node.js 的 Web 框架的 3 個(gè)層次,理清了就不迷茫

 web 框架指的是處理 http、https 的服務(wù)端框架,Node.js 提供了 http、https 模塊用于處理協(xié)議數(shù)據(jù),這是 web 框架的基礎(chǔ)。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)改則,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

但是 http、https 的 api 過(guò)于簡(jiǎn)單,用起來(lái)比較麻煩,所以一般會(huì)用 express、koa、fastify 這種封裝了一層的框架來(lái)簡(jiǎn)化。

但 express 類的框架不提供代碼架構(gòu)方面的限制,所以對(duì)于模塊比較多比較復(fù)雜的企業(yè)級(jí)應(yīng)用來(lái)說(shuō)并不適合,這時(shí)就要用實(shí)現(xiàn)了 MVC 的 eggjs、nestjs 這類企業(yè)級(jí) web 框架。

這是 web 框架的 3 個(gè)層次,理清了它們的關(guān)系和適用場(chǎng)景,再去學(xué)習(xí)才不會(huì)迷茫。

下面我們分別來(lái)看一下:

http、https

http 是基于 TCP 的,對(duì) TCP 傳過(guò)來(lái)的 http 協(xié)議數(shù)據(jù)做 parse,傳給 handler 處理,handler 處理完要返回 http 響應(yīng),這是 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 模塊雖然能處理請(qǐng)求和響應(yīng),但是提供的 api 過(guò)于原始:

比如獲取請(qǐng)求參數(shù)還要用 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); 

比如返回響應(yīng)只能用 write 或者 end 返回一段 buffer 或 string,想返回 JSON、文件下載、html 視圖等都要自己實(shí)現(xiàn)。

而且 get、post、put、delete 等請(qǐng)求類型也要自己做判斷。

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

因?yàn)橛羞@些痛點(diǎn),所以一般我們不會(huì)直接用 http 模塊,而是用封裝了一層的 express、koa、fastify 這類 web 框架。

express、koa、fastify 等

express 這類框架解決了剛才的那個(gè)痛點(diǎn)問(wèn)題:

  • 提供了路由機(jī)制,不用自己手動(dòng)判斷 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 獲取請(qǐng)求參數(shù)

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

res.download 返回下載的響應(yīng)

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

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

 
 
 
 
  1. app.render('xxx-template', { name: 'guang' }, function (err, html) { 
  2.   // ... 
  3. }) 
  • 提供了中間件機(jī)制,用于復(fù)用一些一些邏輯:

比如文件上傳中間件

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

提供了這么多方便的功能,確實(shí)比 http 模塊用起來(lái)簡(jiǎn)單多了。

但是 express 類的 web 框架也有問(wèn)題,就是沒(méi)有提供組織代碼的模式,當(dāng)模塊多了代碼很容易亂掉,因?yàn)樗皇前凑疹愃蒲笫[的順序調(diào)用中間件,沒(méi)有模塊和 MVC 的劃分。

express 類框架做一些小的服務(wù)可以,企業(yè)級(jí)應(yīng)用還得用 nestjs、eggjs 這類 MVC 框架。

nestjs、eggjs、midwayjs、daruk 等

nestjs 類的框架就實(shí)現(xiàn)了 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 { 
  12.     return this.usersService.create(createUserDto); 
  13.   } 
  14.  
  15.   @Get() 
  16.   findAll(): Promise { 
  17.     return this.usersService.findAll(); 
  18.   } 
  19.  
  20.   @Get(':id') 
  21.   findOne(@Param('id') id: string): Promise { 
  22.     return this.usersService.findOne(id); 
  23.   } 
  24.  
  25.   @Delete(':id') 
  26.   remove(@Param('id') id: string): Promise { 
  27.     return this.usersService.remove(id); 
  28.   } 

nestjs 是對(duì)標(biāo) java 的 spring 的,實(shí)現(xiàn)了 IOC、AOP 等模式,模塊之間耦合度很低,就算再?gòu)?fù)雜的項(xiàng)目,通過(guò) Module、Controller、Service 等也可以很好的被組織起來(lái),相比 express 來(lái)說(shuō),組織代碼方面提升了一個(gè)檔次。

nestjs 的底層就是 express、fastify 等 web 框架,而且還可以靈活的切換底層實(shí)現(xiàn)。

可以看到,nestjs、eggjs 類的企業(yè)級(jí)框架,除了有豐富的 api 以外,更重要的是提供了代碼組織的規(guī)范,通過(guò) Module、Controller、Service 等概念可以很好的組織復(fù)雜的業(yè)務(wù)邏輯。

總結(jié)

web 框架都是基于 http、https 模塊,但它提供的 api 過(guò)于原始,使用起來(lái)比較麻煩,所以我們一般會(huì)用 express、koa 這類框架來(lái)簡(jiǎn)化,它提供了中間件機(jī)制來(lái)復(fù)用邏輯,提供了更多的 request、response 的 api,但卻沒(méi)有組織復(fù)雜代碼的能力,對(duì)于企業(yè)級(jí)的復(fù)雜應(yīng)用,還是會(huì)用 nestjs、eggjs 這類 MVC 框架,它們的底層是 express、koa,但提供了 Module、Controller、Service 等概念,可以很好的組織復(fù)雜的代碼。

要理清楚為什么會(huì)有這三個(gè)層次,都各自適合什么場(chǎng)景,這樣才能更好的掌握它們,在技術(shù)選型上才不會(huì)迷茫。


新聞名稱:Node.js 的 Web 框架的 3 個(gè)層次,理清了就不迷茫
標(biāo)題路徑:http://m.5511xx.com/article/djijodd.html