耿健的个人博客

一个即将放飞理想的咸鱼博主

0%

46.说点最近研究express的那点事

只是开头

服务器到手之后,
前端项目部署完,
就开始手痒痒想要研究研究后端接口咋实现的.
想起了 N 年前摆弄过的 express,
果断的开始折腾起来.

实现功能

虽然说是用野路子搭建一个后端项目,
不过尽量还是模拟成平时在项目中应用的那种感觉.

  1. 首先需要具备多环境
  • PROD 环境用以生产使用
  • UAT 环境用以开发使用
  1. 安全性: 搞一套 JWT 身份认证
  • JWT(JSON Web Token)是一种在网络中以 JSON 格式安全地传输信息的令牌.
  • Token 令牌用于身份认证. 由于 HTTP 请求是无状态的, 所以需要通过 token 来获取每次请求的用户信息.

token 可以通过 jsonwebtoken 三方库来生成,
后端对一个用户身份验证通过后,
会将这个用户非敏感的信息,
经过秘钥签名算法进行编码,
进而生成一个 token 并返回给客户端.

而用户在后续请求的时候,
需要携带这个 token,
服务器处理请求的时候,
可以通过携带的 token 经过秘钥签名算法下进行解码,
进而得知当前用户的身份信息.

  1. 安全性: 签名验证

为了防止一些恶意抓包, 修改请求数据欺骗服务器的情况,
服务器和客户端要设计一套加密算法.
两边将相同的变量以某种固定的格式进行 md5 加密,
如果两边得出的结果相同即为合法请求,否则会认为是非法请求进行.

像是某些比较敏感的重要请求,
比如增加积分, 奖励等操作, 则需要请求 id 做重复校验.
即为同一个请求 id 只能操作一次,否则就会非法报错.

  1. 规范性: 遵循 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 删除操作
  1. 规范性: 搞一个通用的可配置的必填参数校验

每个接口暴露出来一个对象,
对象中将该接口所需的必传参数 key 暴露出来.

然后在接口的外层统一拦截器对其进行校验判断,
如果没有传入该字段, 即不会走入到业务逻辑中,
直接返回 400 报错.

  1. 规范性: 统一一个报错枚举表

单独维护一个配置文件,
将所有报错枚举统计出来,
后续接口业务逻辑中的所有报错枚举,
都需要在这个表里取值.

  1. 规范性: 支持不同格式请求体/返回体
  • 常规场景
    json 格式

  • 上传文件场景
    支持 file 文件格式

  • AI 会话场景
    stream 格式返回

  1. 规范性: 跨域配置 CORS

服务器端定义跨域请求规则.

  1. 链接数据库, 且支持事务回滚(未实现)

数据库选型选择了 mongodb.
好处是在于接入方便, 容易扩展, 简单易上手.
缺点在于数据量到达一定量级之后性能会急剧下降.(估计也达不到)

事务回滚指的是:
即为当一个请求操作的时候,
需要后端服务器多个表进行读写.

在多个写入操作中如果其中一个报错,
那么之前操作过得所有记录都需要恢复.

选型的 mongodb 在 4.0 版本之后才支持事务,
而且想要支持事务回滚, mongodb 还需要配置副本集.
配置过程中各种花式报错,
裂开了…
研究好久没搞出来,先搁置吧…

  1. 缓存层(未实现)

目前代码直接对数据库进行读写,
频繁的对数据库进行 I/O 操作肯定是影响性能.

由于目前体量较小,
业务也不复杂,
勉强跑着.

后续如果体量变大之后,
需要考虑搞一个缓存层, 如: Redis,
减少对数据库的直接操作.

  1. 伸缩性(未实现)

这个说远了, 实在能力有限了,
真要是有一天发达了,
用户数量需要用到集群才能解决的时候,
要么就干脆直接托管云服务了,
要么就已经抱住了强力大腿了.

  1. 搞一个可视化接口文档
  • 借助 express-swagger-generator 三方库来实现.

在每个接口上,
这个库支持以注释的方式书写接口的 route/group/header/params 等信息,
那么在项目运行的时候,
就会自动生成出一套 swagger 在线接口文档.

目前已经实现

同时这个在线接口文档也支持发起接口请求,
方便开发的时候调试.
(有的时候懒得特意再起 Postman)

  1. 实现自动生成 CURD 脚本(待实现)

创建表之后, 自动生成对该表进行增删改查的 4 个常用接口.

后记

现在已经初步能实现了一些小功能,
后面随着功能的增加,
业务需求的需要,
会慢慢继续完善自己的这个 express 项目.