设计架构
tips
项目使用 express 和 ts
概念
我们不可能把应用里的东西都放在同一个文件里面,因为这样会让应用变得混乱不堪,所以需要一种合适的架构,将应用分割成不同的部分。每个部分里可以有自己的组织结构。在很多重型的框架里面都会提供这样的架构,比如这种框架里可能会有模块、服务、拦截器、守卫、中间件这些东西,在应用中可以创建这些东西然后把它们组织在一起。规划应用的架构可以根据功能将应用分割成不同的部分,比如说 app 表示应用,auth 是身份验证,user 是用户,post 是内容,comment 是评论等等。每个部分都可以单独的放在一个目录里面。每个部分又可以细分一些组件,比如 router 表示路由,controller 表示控制器,middleware 是中间件,service 是服务。比如说 user,它里面的东西是和用户相关的东西,可以把它单独放在一个 user 的目录里面,在这个目录里面又可能会包含一些文件,比如说 user-router,user-controller,user-middleware,user-service,在 router 文件可以定义跟这个部分相关的一些路由,也就是应用的接口,在 controller 文件中可以定义接口需要的处理器,这样在 router 文件里面就可以导入使用在 controller 中定义的这些处理器。模块里面需要的中间件可以单独放在 middleware 这个文件里面,在 service 文件里可以定义一些服务方法,其实就是一些函数,在别的地方可以导入使用这些函数,比如在控制器的方法里面可以重复地用到这些东西。在控制器的方法里面可能会重复用到的一些东西我们可以单独地把它定义成一个服务,这样就可以重复地去使用了。
把应用的配置放在环境变量里
将环境变量的设置放在一个文本文件里面,具体方法为:
- 安装 dotenv:npm install dotenv –save-dev
- 项目根目录创建.env 文件 在这个文件里定义环境变量 比如 APP_PORT = 3000
- 在 gitignore 文件里忽略.env 开头的文件: .env*
- 创建一个配置文件,比如 app.config,并配置
1 | import dotenv from 'dotenv' //引入刚安装的包 |
- 使用的时候,举个例子
1 | import {APP_PORT} from './app/app.config' //引入 |
控制器
接口需要的处理器我们可以放在一种叫控制器的东西里面,控制器只是个名字,没什么特别的,应用里的每个部分都可以创建一个控制器,比如内容资源可以创建一个控制器,用户资源也可以有自己的控制器,在控制器里可以定义一些接口需要的处理器,也就是一些函数。控制器可以是这个样子:
1 | import { Request, Response, NextFunction } from 'express'; //引入接口、处理器、参数需要的类型,ts用 |
路由
应用的接口、或者叫路由,也可以单独的放在一个路由文件里面,应用的每个部分都可以有单独的一个路由文件,在这个文件里面可以定义应用的这部分需要的接口。路由是这样的:
1 | import express from 'express'; //导入express |
用的时候这样写:
1 | import postRouter from '../post/post.router' |
服务
在应用里可以加一层服务,用它来缓解控制器的压力,就是可以把一些事情分配给服务去做,创建一个服务文件比如 post.service,内容可以是这样的:
1 | /** |
用的时候:
1 | import { getPosts } from './post.service'; |
中间件
middleware ,写法可以是这样的:
1 | import { Request, Response, NextFunction, request } from 'express'; |
使用在路由中:
1 | import { requestUrl } from '../app/app.middleware'; |
默认的异常处理器
异常处理器就是个函数,跟中间件和接口处理器都差不多,只不过多了个 error 参数。在中间件中设置默认异常处理器:
1 | /** |
在页面中配置:
1 | import { defaultErrorHandler } from './app.middleware'; |
在控制器的中判断一下:
1 | /** |
这时候测试一下,会弹出服务暂时出了点问题的提示