Node.jsweb框架的三个层次,弄清楚就不会混淆了是web框架的基础。但是http和https的api过于简单,使用起来也比较繁琐,所以一般会使用express、koa、fastify,通过一层框架来简化封装。但是express框架不提供代码结构限制,不适合模块多且复杂的企业级应用。这种情况下,就必须使用实现MVC的eggjs、nestjs等企业级web框架。这些是Web框架的三个级别。理清了它们的关系和适用场景,学习起来就不会一头雾水了。我们分别来看一下:http和httpshttp是基于TCP的。它们解析TCP传递过来的http协议数据,传递给handler进行处理。处理程序完成处理后,它会返回一个http响应。这就是http模块的作用。consthttp=require('http');constserver=http.createServer((req,res)=>{res.writeHead(200,{'Content-Type':'text/plain'});res.end('好的');});server.listen(8080,'127.0.0.1');http模块虽然可以处理请求和响应,但是它提供的API过于原始:比如获取请求参数,使用url模块解析一次consthttp=require('http');consturl=require('url');http.createServer(function(req,res){constqueryObject=url.parse(req.url,true).query;console.log(queryObject);res.writeHead(200,{'Content-Type':'text/html'});res.end('xxx');}).listen(8080);比如returnresponse只能返回一个buffer或者stringwithwriteorend,如果要返回json、文件下载、html查看等,就得自己实现了。而且get、post、put、delete等请求类型要自己判断。if(req.method==='get'){//...}elseif(req.method==='post'){//...}//...因为这些痛点,所以general我们不会直接使用http模块,而是封装了一层的express、koa、fastify等web框架。express、koa、fastify等框架解决了刚才的痛点问题:提供路由机制,无需手动判断method和pathapp.get('/list',function(req,res){//...})app.post('/save',function(req,res){//...})提供更好的请求和响应api:如req.params获取请求参数app.get('/user/:id',function(req,res){res.send('user'+req.params.id)})res.download返回下载的响应res.download('/report-12345.pdf')res.render返回由模板引擎呈现的html应用程序。render('xxx-template',{name:'guang'},function(err,html){//...})提供了一种中间件机制,用于复用一些Logic:比如文件上传中间件app.use(fileUpload({useTempFiles:true,tempFileDir:'/tmp/'}));提供了这么多方便的功能,确实比http模块好用多了。但是expressweb框架也有一个问题,就是没有提供组织代码的模式。当模块太多的时候,代码很容易乱,因为它只是按照洋葱的顺序调用中间件,没有模块和MVC的划分。express类框架可以做一些小服务,企业级应用必须使用nestjs、eggjs等MVC框架。Nestjs、eggjs、midwayjs、daruk等nestjs框架实现了MVC模式,代码有明显的Controller、Service、Model、View划分:import{Body,Controller,Delete,Get,Param,Post}from'@nestjs/common';import{CreateUserDto}from'./dto/create-user.dto';import{User}from'./user.entity';import{UsersService}from'./users.service';@Controller('用户')exportclassUsersController{constructor(privatereadonlyusersService:UsersService){}@Post()create(@Body()createUserDto:CreateUserDto):Promise
