0%

浅谈用node.js开发后台api的要点

浅谈用node.js开发后台api的要点

作者:草梅友仁

前言

前段时间为了统计下开发的插件的使用情况,于是为此开发了相应的后台。

自我感觉这是我写的最好的、架构最清晰的一次后台。

和以前比也有了不小的进步。

虽然后台还没有开发完毕,还有些想法没有实现,但是先写点下来,以免以后忘记了。

一、项目目录

本次最主要的进步是对于项目目录进行了合理的划分,使用了常见的routes、controllers、services划分,具体的可以见图片。

mark

根目录也没啥好说的,都是些项目基本配置,重点还是在src目录里面

mark

下面来逐个解释文件/文件夹的用处

  • bin 用于存放项目启动脚本,里面只有一个www.ts文件,是服务的入口。这个是express4的惯例,在此保持一致
  • config 配置项,将一些配置抽离出来单独管理,有利于维护
  • controllers 这个地方主要用于处理进来的Request和返回Response
  • db 存放数据库操作。本项目用到的数据库为leancloud,可以免费使用的云数据库。由于使用了云数据库,这里只有初始化操作。如果使用本地的数据库可以在这里封装数据库操作。
  • middleware 中间件。用来对验权、限流等操作
  • models 模型。用来存放实体类和返回的数据结构。这样有利于统一数据交互的结构
  • routes 路由。进行请求分发,调用controllers
  • schedule 存放定时任务。比如每隔一小时进行一次统计
  • services 业务逻辑。实际处理业务逻辑的地方。注意,此处不应该操作Request和Response,数据处理应在controllers完成。
  • utils 工具类。一些通用的方法、函数可以放在这里
  • app.ts express的配置。

可以说,对项目进行合理的划分,就已经是成功的一半了

实际上本次开发也进行的非常快,除了项目本身就不是很大以外,合理的架构也让我事倍功半。

二、自带api文档

本次项目的另一个有趣之处使用了swagger-ts-doc、swagger-ui-express来生成api的文档,既方便调试也方便debug。

具体的使用可以直接去搜下swagger的使用方法

(当然,这也不是自动生成的,而是你要写一些装饰器和说明)

mark

mark

三、对每一个调用api的请求进行鉴权和限流

本项目的限流使用了express-rate-limit这个模块,也比较方便。

(由于服务器是个小水管,因此设置的QPS很小。。)

mark

鉴权实际上采用的是id-key设计

参考了leancloud的设计思路,也就在Request的header中添加鉴权信息。理论上讲用https发起请求本身也比较安全,但为了更加安全,因此需要对key进行加上时间戳的hash作为sign来校验,具体的hash算法可以自己设计,只要每次请求的sign都不一样就ok了。当然了,考虑到彩虹表的存在,key也不能太简单,不然别人还是能通过hash来反向推出key的

四、使用统一的api风格

虽然在设计之初是想用rest风格的,不过很遗憾,搞到最后也没能实现rest风格。在接口设计上还是保留了一些自己的习惯,在此就不献丑了。总之,一个项目中的api风格肯定是要统一的

五、使用TypeScript

实际上用js也行。不过一旦用过ts就回不到js了。ts意味着强类型,但完全兼容js,在大型项目上十分好用。随着js的日新月异,可以说一个没有编译的js项目已经不存在了,既然如此,那么直接用ts来写岂不是更加美好?强类型意味着静态校验、自动提示。而且类型本身就是一个最强的注释,基本上只要看到这个类名就知道这个类是干什么的了。

本次项目应该是本人第三次使用ts,效果拔群

六、使用云数据库leancloud

  1. 由于服务器的内存实在太小,如果挂个MySQL或MongoDB,内存分分钟爆炸,因此使用了leancloud。面向对象的非关系型数据库十分适合js、ts这样的语言来开发。而且文档齐全,官方也是强推,比较好用。与MongoDB比较类似,我估计它的底层就是MongoDB。常见的语言基本上都封装的相应的sdk,用就完事了。
  2. 后来又在本地安装了MongoDB来减少云数据库的调用次数,MongoDB和leancloud用法十分类似,与node.js十分搭配,因此选定了MongoDB

七、使用server-chan来监控服务器错误

本次项目还有个有趣的东西:server-chan 。一个免费的可以推送消息到你的微信的工具。由于没有找到喜欢的npm包就干脆自己写了一个,叫“node-server-chan”。功能也很简单,只有一个类,两个方法,分别是初始化方法和推送消息方法。

1
2
3
4
5
6
import { ServerChan } from 'node-server-chan'
//SCKEY请前往 https://sc.ftqq.com 领取
ServerChan.init('SCKEY')
//标题必填,内容选填
ServerChan.noticeMaster('text')
ServerChan.noticeMaster('text', 'desp')

后记

好了,先写到这里,以后有了新的想法再改吧。。

  1. 首发——2019/9/3
  2. 增加了关于MongoDB的部分——2019/9/20

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/ddd5e287.html
版权声明:转载请注明出处!

坚持原创技术分享,您的支持将鼓励我继续创作!