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
中进行项目参数配置
export default {
environment: 'dev', // dev: 开发模式、prod: 生产模式
port: 3000, // 端口号
database: {
dbName: 'island', // 数据库名
host: 'localhost',
port: 3306,
username: 'root', // 账号
password: '159951', // 密码
force: false, // 是否强制删除后重建表
logging: true, // 打印 ORM所执行的 SQL语句
},
security: {
secretKey: 'But you, Lord , are a shield around me, my glory, the One who lifts my head high.',
expiresIn: 60 * 60 * 24 * 30, // 60秒 * 60 * 24 * 30 = 1个月
},
wx: {
appID: '**abc123**', // 微信小程序ID
appSecret: '**abc123**', // 微信小程序密钥
loginUrl: 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code',
},
yushu: {
detailUrl: 'http://t.yushu.im/v2/book/id/%s',
keywordUrl: 'http://t.yushu.im/v2/book/search?q=%s&count=%s&start=%s&summary=%s',
},
}
电脑数据库的名称、账号和密码,此外支持小程序登录需填充小程序的ID和密钥。
其中,默认端口号为3000
项目讲解
目录结构
.
├── app.ts // 项目入口文件
├── core // 项目核心代码
│ ├── init.ts // 项目初始化
│ ├── base-validator.ts // 校验方法的基类
│ ├── db.ts // Model的基类
│ ├── decorator.ts // 装饰器
│ ├── http-exception.ts // 基础的通用性异常
│ ├── middleware // 中间件
│ │ ├── auth.ts // 权限控制
│ │ └── exception.ts // 异常统一处理
│ └── util.ts
├── config // 配置文件
│ └── index.ts
├── types // Typescript自定义类型
│ └── index.ts
└── app
├── api
│ ├── cms // API接口(cms版本)
│ │ └── user.ts // 用户管理API接口
│ └── v1 // API接口(v1版本)
│ ├── book.ts // 书籍API接口
│ ├── classic.ts // 期刊API接口
│ ├── like.ts // 点赞API接口
│ ├── token.ts // 登录令牌API接口
│ └── user.ts // 用户API接口
├── exception // 业务相关异常
│ └── index.ts
├── lib
│ ├── enum.ts // 统一的枚举
│ └── scope.ts // 权限级别
├── model // Model层(数据库)
│ ├── art.ts //
│ ├── book.ts // 书籍表
│ ├── classic.ts // 期刊(音乐、摘句、影片)表
│ ├── comment.ts // 书籍评论表
│ ├── favor.ts // 收藏表
│ ├── flow.ts // 期刊号表
│ ├── hot-book.ts // 热门书籍表
│ └── user.ts // 用户表
├── service // Service层
│ ├── login-verify.ts // 登录相关校验服务
│ └── wx-token.ts // 微信登录相关服务
└── validator // 参数校验层
└── 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,即依赖注入。
依赖注入是控制反转最常见的一种应用方式,即通过控制反转,在对象创建的时候,自动注入一些依赖对象。