Github: https://github.com/Allen7D/koa-ts

本项目可用于学习Typescript在Node.js中的后端实践,包括如下:
1、熟悉Typescript的常用写法
2、Koa的异步的Promise写法转为同步的Async/Await写法
3、装饰器在中间件上使用,实现拆分路由装饰器、权限控制装饰器
4、AOP(面向切面编程)设计,实现参数校验层、异常统一处理层
5、Model模型JSON序列化控制,实现API接口级的字段显示与隐藏
6、易扩展的接口版本管理

快速上手

src\config\index.ts中进行项目参数配置

  1. export default {
  2. environment: 'dev', // dev: 开发模式、prod: 生产模式
  3. port: 3000, // 端口号
  4. database: {
  5. dbName: 'island', // 数据库名
  6. host: 'localhost',
  7. port: 3306,
  8. username: 'root', // 账号
  9. password: '159951', // 密码
  10. force: false, // 是否强制删除后重建表
  11. logging: true, // 打印 ORM所执行的 SQL语句
  12. },
  13. security: {
  14. secretKey: 'But you, Lord , are a shield around me, my glory, the One who lifts my head high.',
  15. expiresIn: 60 * 60 * 24 * 30, // 60秒 * 60 * 24 * 30 = 1个月
  16. },
  17. wx: {
  18. appID: '**abc123**', // 微信小程序ID
  19. appSecret: '**abc123**', // 微信小程序密钥
  20. loginUrl: 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code',
  21. },
  22. yushu: {
  23. detailUrl: 'http://t.yushu.im/v2/book/id/%s',
  24. keywordUrl: 'http://t.yushu.im/v2/book/search?q=%s&count=%s&start=%s&summary=%s',
  25. },
  26. }

电脑数据库的名称、账号和密码,此外支持小程序登录需填充小程序的ID和密钥。
其中,默认端口号为3000

项目讲解

目录结构

  1. .
  2. ├── app.ts // 项目入口文件
  3. ├── core // 项目核心代码
  4. ├── init.ts // 项目初始化
  5. ├── base-validator.ts // 校验方法的基类
  6. ├── db.ts // Model的基类
  7. ├── decorator.ts // 装饰器
  8. ├── http-exception.ts // 基础的通用性异常
  9. ├── middleware // 中间件
  10. ├── auth.ts // 权限控制
  11. └── exception.ts // 异常统一处理
  12. └── util.ts
  13. ├── config // 配置文件
  14. └── index.ts
  15. ├── types // Typescript自定义类型
  16. └── index.ts
  17. └── app
  18. ├── api
  19. ├── cms // API接口(cms版本)
  20. └── user.ts // 用户管理API接口
  21. └── v1 // API接口(v1版本)
  22. ├── book.ts // 书籍API接口
  23. ├── classic.ts // 期刊API接口
  24. ├── like.ts // 点赞API接口
  25. ├── token.ts // 登录令牌API接口
  26. └── user.ts // 用户API接口
  27. ├── exception // 业务相关异常
  28. └── index.ts
  29. ├── lib
  30. ├── enum.ts // 统一的枚举
  31. └── scope.ts // 权限级别
  32. ├── model // Model层(数据库)
  33. ├── art.ts //
  34. ├── book.ts // 书籍表
  35. ├── classic.ts // 期刊(音乐、摘句、影片)表
  36. ├── comment.ts // 书籍评论表
  37. ├── favor.ts // 收藏表
  38. ├── flow.ts // 期刊号表
  39. ├── hot-book.ts // 热门书籍表
  40. └── user.ts // 用户表
  41. ├── service // Service
  42. ├── login-verify.ts // 登录相关校验服务
  43. └── wx-token.ts // 微信登录相关服务
  44. └── validator // 参数校验层
  45. └── index.ts

路由装饰器

权限装饰器

Swagger 接口文档

基于 TypeScript 的 IoC 与 DI

Daruk.js 文档)
[基于 TypeScript 的 IoC 与 DI] https://zhuanlan.zhihu.com/p/72323250
InversifyJS 中文文档)

什么是 IoC?

IoC 英文全称为 Inversion of Control,即控制反转
控制反转是面向对象编程中的一种原则,用于降低代码之间的耦合度。传统应用程序都是在类的内部主动创建依赖对象,这样将导致类与类之间耦合度非常高,并且不容易测试。有了 IoC 容器之后,可以将创建和查找依赖对象的控制权交给了容器,这样对象与对象之间就是松散耦合了,方便测试与功能复用,整个程序的架构体系也会变得非常灵活。

什么是DI?

DI 英文全称为 Dependency Injection,即依赖注入
依赖注入是控制反转最常见的一种应用方式,即通过控制反转,在对象创建的时候,自动注入一些依赖对象。