Egg.js&Nest.js简易上手比较今年二月份的时候忙于夜大的毕业设计,做了一个密钥管理生成的小项目。当时的

Egg.js基于Koa做的二次开发,Nest.js我用的是基于Express实现的版本,这二者的具体实现上还是有些差异,但整体上都是基于Controller-Service的实现思路。可以先看看Egg.jsd的目录结构

Egg.js的实现思路较为简单,后端的所有功能最后都会绑定在全局变量app上,app就像一个巨大的容器,它包含了路由,控制器,服务,扩展,中间件等等,所有的东西都是全局的,router.js则充当了项目的主入口文件,在这里可以自行配置最终给前端调用的接口。

Nest.js的目录结构大概是这样的

相比之下,Nest.js的结构可以说更清晰一些,main.ts作为项目的入口文件,而Nest比Egg多一项的概念则是模块,即Module-Controller-Service的结构,app.module.ts导入并整合各个模块,最终将这个大模块用于main.ts中

我以一个POST的请求为例,使用Egg的话请求接口的具体地址是在router.js中编写实现,同时,该请求需要token权限才能访问,那么Egg的思路是将token作为中间件,作为参数传到router.js中具体的post的请求上

//router.js//在全局变量中获取中间件和配置项const{router,controller,middleware,config}=app;//生成中间件tokenconstjwt=middleware.jwt(config.jwt);...//在具体的请求中添加token中间件router.post(`${baseURL}/users/add`,jwt,controller.users.create);然后,路由函数会调用controller对应的方法,controller会再从对应的service中找到对应的方法执行并返回结果

//users/users.module.ts...@Module({imports:[SequelizeModule.forFeature([Users,Roles,Usertokens]),MailModule,OperalogModule],providers:[UsersService],controllers:[UsersController]})exportclassUsersModule{}那么Nest怎样实现同样地址的路由,这则需要在controller中实现,不同于Egg的路由有一个固定的方法,Nest引入了装饰器的思想,Controller作为路由的主入口代表第一级,而具体的Post/Get装饰器中定义的字符串为第二级。而关于权限的拦截也是基于装饰器的思想,使用UseGuards装饰器在具体路由的上方填入token进行拦截处理。

通常情况下,我们会对数据库查询的内容包装一层再返回给前端,这里Egg和Nest的处理思路有很大不同,Egg在controller通过ctx.result返回,如果在service中强行赋值一个自己给的错误码则可以修改数据返回的状态码,如之前举例中的users.service错误码赋值500是可以返回回来的,平常情况下则可以自定义一个基础的BaseController返回包装的数据结构。

//controller/base.jsconstController=require('egg').Controller;classBaseControllerextendsController{result(data,code=200,isSuccess=true,message='操作成功'){this.ctx.body={code:code,success:isSuccess,message:message,data}}}module.exports=BaseController;Nest修改状态码则不够灵活,只能通过装饰器@HttpStatus修改,但是在一些全局处理上这样修改很复杂,比如token失效我希望状态码变成401这样就很难,我看了文档也没找到合适的办法,最终只能采取折中方案,在自定义的返回中写入一个状态码,前端以这个自定义的状态码为准进行判断,实际上之前我也是这么写的。

token这里Egg和Nest的思路也是不一样的,Egg有专门的生成token的插件,利用插件生成token后在全局使用,生成之后可以使用一个中间件作为拦截,判断当token失效以后返回401

//auth/strategies/jwt.strategy.tsimport{Injectable}from'@nestjs/common';import{PassportStrategy}from'@nestjs/passport';import{ExtractJwt,Strategy}from'passport-jwt';import{secret}from'src/common/conmstr';@Injectable()exportclassJwtStrategyextendsPassportStrategy(Strategy){constructor(){super({jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),ignoreExpiration:false,secretOrKey:secret,});}asyncvalidate(payload:any){return{token:payload.token}}}那要怎样在token失效后返回错误消息退出呢?我目前做到的也就是我之前提到的定义一个全局拦截器,在失效之后返回自定义的401错误码交由前端处理。

//前端/api/axios.js...//全局拦截添加token(Egg.js不需要Bearer,Nest.js需要Bearer,我目前不知道怎样在后端解决这个问题)if(store.state.token!=""){config.headers.common['Authorization']='Bearer'+store.state.token//config.headers.common["Authorization"]=store.state.token;}...关于数据库数据库我使用MySql,Egg操作数据库非常简单,Egg本身就可以找到mysql的数据库插件,大部分的查询和新增操作利用插件功能可以完成,小部分的查询编写sql可以实现,例如keys.js下的审核和查询等

//service/keys.js...//审核asyncaudit(params){const{app}=this;letsubData={id:params.id,status:params.result,reason:params.reason,auditDate:app.mysql.literals.now}constresult=awaitthis.app.mysql.update('theKeys',subData);//利用Egg自带的插件更新if(result.affectedRows===1){return{result};}else{return{code:500,success:false,message:'更新失败'}}}//用户可操作性密钥asyncuserKeys(params){constuser=awaitthis.app.mysql.get('users',{loginName:params.loginName});//console.log('user:',user);letsql=`selectid,keyNamefromtheKeyswherekeyUserlike"%${user.id}%"andstatus=2`;constlist=awaitthis.app.mysql.query(sql);returnlist;}但是Nest的数据库操作就稍微复杂了一点,Nest没有有个比较官方的方案,在Mysql上目前可以配合官方插件使用第三方库TypeORM或者Sequelize操作数据库,我这里使用的是Sequelize,但不管使用哪个库,nest都不能直接查询或修改数据,而是要为每一个表建立相应的数据模型,再在不同的模块service下通过模型操作数据。比如,首先我们先定义用户数据表的模型

import{Module}from'@nestjs/common';import{SequelizeModule}from'@nestjs/sequelize';...@Module({imports:[SequelizeModule.forFeature([Users]),//表示使用了Users模型...],...})exportclassUsersModule{}在对应的servcice里再次引入模型,并在constructor定义模型变量并具体使用

以上就是我对Egg和Nest分别开发相同项目的一些比较感受,在我看来Egg的思想是便捷,一个像我这样对后端不怎么了解的开发者只要按照文档,使用对应的插件就可以开发出一个还不错的后端项目。而Nest则更加强调规范,严格的三层架构,基于模块的思想和装饰器的广泛使用,确保了开发者能编写出通用的代码,但是对于开发者对项目的组织能力也有一定的要求。如果是一个长期维护的后端项目,显然当下比较流行的Nest.js还是更胜一筹的。

THE END
1.web前端期末大作业基于HTML+CSS家乡主题毕业设计源码(1)HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 二、作品效果 视频演示 https://live.csdn.net/v/embed/239893 ...https://www.jianshu.com/p/392ffb83a165
2.Java毕业设计资料教程全套下载Java开发毕业设计从入门到精通尚硅谷毕业设计 01React管理系统 免费领取全套资料 此项目为一个前后台分离的后台管理的SPA, 包括前端PC应用和后端应用,包括用户管理、商品分类管理、商品管理、权限管理等功能模块,前端使用React全家桶以及Antd、 Axios、ES6、Webpack等技术,后端使用Node、Express、Mongodb等技术,采用模块化、组件化、工程化的模式进行...https://www.atguigu.com/bishe
3.毕业设计(基于html5+css的博客开发系统)lynnlovebear纯属自己的毕业作品,虽然并不完美,但是要结合设计+前端+后台代码在有限的时间内做成这样,我觉得还是可以了。 此作品重在前端,有些效果截屏看不出,所以凑合着欣赏吧! 响应式login页面,css3的效果 个人资料介绍界面(非博主看不到“编辑”按钮) 编辑个人资料界面 ...https://www.zcool.com.cn/work/ZMTIxODQ3MzY==.html
4.计算机专业毕业设计论文成品网计算机专业毕业设计论文成品网,提供完整的计算机毕业设计、计算机专业毕业设计、网站类毕业设计服务的网站,主要包括php,java,asp.net,安卓等成品,是大学毕业生不可或缺的学习参考网站。http://www.bishe130.com/
5.计算机毕业设计,计算机毕业论文开题报告,毕设作品网针对计算机入门者提供全方位的编程技术基础入门服务,主要是几个板块:电子教程、视频教程、在线考试测试、毕业设计指导、疑难解答、IT计算机技术文章,涉及html、css、javascript、微信和小程序、php、asp、jsp等,打造一条龙式的学习服务,提供各类前端开发、web后端开发、移http://www.2d5.net/
1.毕业设计集合程序员小马软件开发定制的博客基于C#的打地鼠的设计与开发 设计报告+项目源码,基于微信小程序图书管理系统(图书借阅系统)毕业论文+前后台源码+PPT+演示视频,基于JavaWeb的汽车售后服务系统设计与实现 毕业论文+外文翻译及原文+答辩PPT+项目源码及数据库文件,java-ee,前端,数据挖掘https://blog.csdn.net/qq_43368615/category_12536604.html
2.毕设学前端的,毕业设计可以做些什么?腾讯云开发者社区那么,好的demo,一个可以拿得出手的demo,必然是“业务+需求+分析设计+算法+数据结构+实现”,共同组成的。 至于具体做什么,网上应该有许多现成的demo,你可以按这个思路,自己去实现一下。相信会有更多的收获,毕竟你的目的已经不是毕业,而是拿它可以找工作。https://cloud.tencent.com/developer/article/1169809
3.前端毕业设计题目可以做哪些(前端设计的毕业论文题目)前端毕业设计题目可以做哪些(前端设计的毕业论文题目) 有哪些简单的web前端的毕业设计课题知乎 1、比如https://github.com/Miserlou/DirtyShare 可以用浏览器实现 P2P 的文件传输。 2、可以做很多,主要是做一些网站类型的,如果是你个人完成的毕业设计的话,可以做一些复杂点的静态网页,比如做一个商城网站,后台管理...https://www.eolink.com/news/post/86355.html
4.web前端毕业实习报告(通用10篇)web前端毕业实习报告 2 一、实习目的 通过对java语言、JavaWeb、Oracle数据库应用设计及SQL语言的复习和锻炼,并且通过使用MyEclipse开发平台设计库存管理系统项目,以达到充分熟悉开发平台及其应用设计。同时掌握并实践软件项目设计规范及其开发流程:需求分析、概要设计、详细设计、代码编写、系统测试及软件手册编写,以便提前适应...https://www.ruiwen.com/shixibaogao/1328435.html
5.网络工程专业人才培养方案(2022)毕业要求3(设计/开发解决方案):能够设计针对复杂网络工程问题的解决方案,设计满足特定需求的网络系统或部件,并能够在设计环节中体现多学科交叉融合的创新意识,考虑社会、健康、安全、法律、文化以及环境等因素。 3.1 掌握网络工程设计和产品开发的全周期、各流程的基本理论、方法和技术,并了解影响设计目标和解决方案的各种...https://www.csust.edu.cn/jtxy/info/1148/20900.htm
6.基于Web的教学网站前端开发设计任务书通过此次实训,使学生基本了解web开发流程,掌握web前端设计技巧,熟悉web前端开发语言的应用,为以后从事web前端开发铺路。 二、实训安排 本课程实训时间安排为第十七、十八周,共18个学时,记1学分。具体时间安排为第十七周周四1-8节、周五1-8节、第十八周周一上午1-4节、周二1-8节、周三1-8节。期中十八周周三下午...http://www.biyezuopin.vip/onews.asp?id=15581
7.GitHubLi毕业设计管理系统可以分为五个模块:登录模块,选题模块,信息管理模块,流程管理模块,文件管理模块。 该系统在技术上使用Spring+SpringMVC+MyBatis整合框架作为后台开发框架,AmazeUI作为前端开发框架。 并使用Ehcache作为项目的缓存,druid作为项目的数据库连接池,使用FreeMarker实现word的导出,使用Shiro完成项目的登录认证,数据库...https://github.com/Li-Zhan/graduation/
8.毕业设计网站C#毕业设计源码 【C002】基于ASP.NET开发酒店管理系统 需求分析: 用户希望通过使用酒店客房管理系统得到所需信息,达到提高管理水平的目的,希望新系统... PHP毕业设计源码 【P012】基于PHP学籍管理系统设计与实现 项目介绍: 基于PHP学籍管理系统设计与实现项目采用MVC模式开发,前端使用bootstra... ...https://by.xmzyw.cn/
9.最新毕业设计开题报告模板(通用9篇)最新毕业设计开题报告模板(通用9篇) 开题报告是指开题者对科研课题的一种文字说明材料。这是一种新的应用写作文体,这种文字体裁是随着现代科学研究活动计划性的增强和科研选题程序化管理的需要而产生的。以下是小编整理的最新毕业设计开题报告模板,欢迎阅读! 最新毕业设计开题报告 篇1 一、选题的意义、研究目的 (一)...https://biyelunwen.yjbys.com/kaitibaogao/666854.html
10.计算机毕业设计报告(精选11篇)计算机毕业设计报告 2 一、引言 项目背景:介绍项目的来源、行业背景以及当前领域的研究现状。 项目目标:明确毕业设计项目的主要目标和预期成果。 二、相关技术概述 关键技术介绍:对项目中所使用的关键技术或框架进行简要介绍,如机器学习算法、数据库技术、前端开发框架等。 https://www.unjs.com/fanwenku/68300.html