只是开头
服务器到手之后,
前端项目部署完,
就开始手痒痒想要研究研究后端接口咋实现的.
想起了 N 年前摆弄过的 express,
果断的开始折腾起来.
实现功能
虽然说是用野路子搭建一个后端项目,
不过尽量还是模拟成平时在项目中应用的那种感觉.
- 首先需要具备多环境
- PROD 环境用以生产使用
- UAT 环境用以开发使用
- 安全性: 搞一套 JWT 身份认证
- JWT(JSON Web Token)是一种在网络中以 JSON 格式安全地传输信息的令牌.
- Token 令牌用于身份认证. 由于 HTTP 请求是无状态的, 所以需要通过 token 来获取每次请求的用户信息.
token 可以通过 jsonwebtoken 三方库来生成,
后端对一个用户身份验证通过后,
会将这个用户非敏感的信息,
经过秘钥签名算法进行编码,
进而生成一个 token 并返回给客户端.
而用户在后续请求的时候,
需要携带这个 token,
服务器处理请求的时候,
可以通过携带的 token 经过秘钥签名算法下进行解码,
进而得知当前用户的身份信息.
- 安全性: 签名验证
为了防止一些恶意抓包, 修改请求数据欺骗服务器的情况,
服务器和客户端要设计一套加密算法.
两边将相同的变量以某种固定的格式进行 md5 加密,
如果两边得出的结果相同即为合法请求,否则会认为是非法请求进行.
像是某些比较敏感的重要请求,
比如增加积分, 奖励等操作, 则需要请求 id 做重复校验.
即为同一个请求 id 只能操作一次,否则就会非法报错.
- 规范性: 遵循 Restful API 接口规范
- 路由携带版本号.
/xxx/v1/xxx/xxx
/xxx/v2/xxx/xxx
- 使用 http 状态码定义 api 执行结果.
主要分为 5 类:
- 信息响应(1xx)
- 成功响应(2xx)
- 重定向(3xx)
- 客户端错误(4xx)
- 服务器错误(5xx)
状态码 code | 含义 |
---|---|
200 | 成功 |
301 | 请求资源永久转移 |
302 | 请求资源临时转移 |
400 | 客户端请求语法错误 |
401 | 用户身份认证错误 |
404 | 无法找到请求资源 |
405 | method 方法不匹配 |
500 | 服务器意料之外的错误 |
- 使用 method 对应不同的请求动作.
请求方式 method | 请求说明 |
---|---|
GET | 查询操作 |
POST | 新增操作 |
PUT | 更新操作 |
PATCH | 部分更新操作 |
DELETE | 删除操作 |
- 规范性: 搞一个通用的可配置的必填参数校验
每个接口暴露出来一个对象,
对象中将该接口所需的必传参数 key 暴露出来.
然后在接口的外层统一拦截器对其进行校验判断,
如果没有传入该字段, 即不会走入到业务逻辑中,
直接返回 400 报错.
- 规范性: 统一一个报错枚举表
单独维护一个配置文件,
将所有报错枚举统计出来,
后续接口业务逻辑中的所有报错枚举,
都需要在这个表里取值.
- 规范性: 支持不同格式请求体/返回体
常规场景
json 格式上传文件场景
支持 file 文件格式AI 会话场景
stream 格式返回
- 规范性: 跨域配置 CORS
服务器端定义跨域请求规则.
- 链接数据库, 且支持事务回滚(未实现)
数据库选型选择了 mongodb.
好处是在于接入方便, 容易扩展, 简单易上手.
缺点在于数据量到达一定量级之后性能会急剧下降.(估计也达不到)
事务回滚指的是:
即为当一个请求操作的时候,
需要后端服务器多个表进行读写.
在多个写入操作中如果其中一个报错,
那么之前操作过得所有记录都需要恢复.
选型的 mongodb 在 4.0 版本之后才支持事务,
而且想要支持事务回滚, mongodb 还需要配置副本集.
配置过程中各种花式报错,
裂开了…
研究好久没搞出来,先搁置吧…
- 缓存层(未实现)
目前代码直接对数据库进行读写,
频繁的对数据库进行 I/O 操作肯定是影响性能.
由于目前体量较小,
业务也不复杂,
勉强跑着.
后续如果体量变大之后,
需要考虑搞一个缓存层, 如: Redis,
减少对数据库的直接操作.
- 伸缩性(未实现)
这个说远了, 实在能力有限了,
真要是有一天发达了,
用户数量需要用到集群才能解决的时候,
要么就干脆直接托管云服务了,
要么就已经抱住了强力大腿了.
- 搞一个可视化接口文档
- 借助 express-swagger-generator 三方库来实现.
在每个接口上,
这个库支持以注释的方式书写接口的 route/group/header/params 等信息,
那么在项目运行的时候,
就会自动生成出一套 swagger 在线接口文档.
同时这个在线接口文档也支持发起接口请求,
方便开发的时候调试.
(有的时候懒得特意再起 Postman)
- 实现自动生成 CURD 脚本(待实现)
创建表之后, 自动生成对该表进行增删改查的 4 个常用接口.
后记
现在已经初步能实现了一些小功能,
后面随着功能的增加,
业务需求的需要,
会慢慢继续完善自己的这个 express 项目.