当前位置: 首页 > 后端技术 > Node.js

通用nodejs开发架构

时间:2023-04-03 13:26:19 Node.js

一、整体架构以nodejs项目为例(前后端不分离),层级结构设计,分层就是把要做的事情抽象出来,划分它们分成几个相互联系的部分,并反映在项目中的文件结构中。上图将项目分为view、router、controller、cache、service、db。其中:(以下为同名文件夹)viewview使用的是ejs模板,相当于ssr服务端渲染;它包含一个组件文件夹,多个业务接口;注意:除了正常的业务界面外,通常还会出现错误和404界面;public组件也会放在view/layout下供ejs引用;router路由器分为view、api、验证;视图路由负责加载ejs,作为页面导航;api路由其实就是数据渲染的接口;verification为参数校验,涉及复用,校验作为中间件引入进行处理;它包括一个路由文件夹和一个接口文件夹;controller主要包括路由器api接口涉及的业务逻辑;它包含多个业务文件;服务需要从控制器调用数据,以及访问数据库的部分逻辑;它包含多个业务文件;db包括数据库的配置和表的数据模型等;每次更新数据模型,都需要执行一个同步文件来进行同步;需要包含一个配置文件,一个同步文件,一个表模型文件夹;cache一般使用redis作为缓存库,包括redis配置、get/set定义和业务文件;需要包括一个配置文件和多个业务文件;2.技术选型侧重于连接数据库和缓存库:view,routerview,这里使用了ejs模板。如果前后端分离,前端使用框架,这个视图层就是一个独立的前端vue/react项目。同样,router不需要view层的路由;ejs配合koa-view指定.ejs文件路径,可以在页面路由中通过ctx.render进行渲染;db连接数据库,不同的数据库有不同的ORM可供操作:关系型数据库mysql可以使用sequelize连接数据库,也可以配合sequelize-auto自动生成表模型model;非关系型数据库mongodb可以使用mongoose连接数据库;unittestingUsejestassertion3.Specification这里的规范包括团队合作、代码风格、编码习惯、业务等。文档样式:不影响影响代码含义的改动,如去掉空格、改动缩进、增删分号build:改动构建工具或外部依赖,如webpack、npmrefactor:重构代码时使用revert:执行gitrevert打印消息gitbrachmaster:master分支,用于部署生产环境的分支,保证master分支的稳定性,一般由develop和hotfix分支合并,不能随时直接修改代码develop:开发分支,始终保持最新完成和修复bug的代码feature:developnew对于功能,创建一个featurebranchbasedondeveloprelease:pre-launchbranch,releaseandteststage,releasebranch代码将作为测试hotfix:repair的基准分支,当线上出现紧急问题,需要及时修复,以master分支为基线,创建一个hotfix分支。修复完成后,需要合并到master分支和develop分支。当一组特性开发完成后,会先合并到develop分支中。当它进入测试时,它会创建一个发布分支。由开发者在release分支直接修复提交。测试完成后,将release分支合并到master和develop分支中。此时master是最新的代码,作为在线版本使用。eslint通过.eslintrc.json文件配置相关的格式要求。编码方面,常量集中在config下,通过import获取,包括mysql配置、redis等数据库配置、服务器地址、加密密钥等公共常量;定义数据模型,在模型中定义接口返回值的格式和内容(不是db中的模型,与db同级),保持输出统一,便于修改;将常用的方法定义为工具类,放到utils下统一管理;一般文件名首字母大写,表示输出的是一个类;注释使用jsdoc,在文件的每一页都标明了描述和作者,标明了方法的函数、参数类型和描述、返回类型和描述;4.登录详解登录可以使用session或者jwt;session是使用koa-generic-session配置的,可以配置存储位置store为redisStore,然后在app.js中注册,可以使用ctx.session全局获取;密码加密可以是encrypted或者bcrypt;中间件参数验证可以作为一个中间件,引入ajv对传入的参数进行验证,将验证码提取到中间件中,再引入到路由器中;中间件还需要加入登录验证,如果没有登录访问路由,跳转到登录页面,如果访问接口没有登录则返回未登录的信息;单元测试使用supertest模块模拟请求,测试接口;安全使用xss模块过滤controller中的输入内容;补充......