- 经过前面几篇的学习,我们已经大致了解了TSRpc的代码结构,和特性,也自己写了一个例子,接下来我们开始写一个完整的业务逻辑。
由于 mongoDB 天然支持json类型,所以它也就成了我们使用TSRpc框架的首选数据库
1. 需求场景
下面是一个很常见的需求场景。

2. 定义协议
我们直接沿用之前的项目,把项目里面的协议文件和api文件都先删掉,根据需求来重新创建相关协议文件。
2.1 创建用于CRUD的四个协议文件

2.2 定义统一类型Post
由于这几个接口都是针对了Post(文章)这个对象,我们也把这个对象单独抽出来定义。

每个字段的意思,直接看单词就能明白,这里也就不写字段的注释了。
2.3 Post对象的优化
由于对象中的 createUid createTime和 updateUid updateTime 字段,因为我们传入的时候,如果存在 createUid 就必须也要传入 createTime ,而 存在 updateUid 的时候也必须传入updateTime ,那么,我们就可以这样改造
/**
* 定义文章的接口
*/
export interface Post {
id: number;
author: string;
title: string;
content: string;
visitedNum: number;
create: {
uid: string;
time: Date;
}
update?: {
uid: string;
time: Date;
}
}
这样修改后,create就必须传入uid 和 time 字段,而update 就必须传入uid 和 time 字段,我们在类型定义的时候,就最大的规避了一些在开发中可能遇到的问题。
但是这样的定义方式,如果使用其他数据库存储,它的查询会比较麻烦,但是用mongoDB这种天生支持json的数据库就会很合适,所以这里推荐使用mongoDB来存储。
3. 难点和挑战
- MongoDB 的ObjectID 类型无法在前端引用
- 如何尽可能减少类型冗余
- 安全:如何限制参数字段
3.1 先安装mongoDB 和 TypeScript
- 安装mongoDB

- 安装TypeScript

3.2 ObjectID类型
因为mongoDB有一个特殊的ID类型,ObjectID类型,一般这么定义:
import {
ObjectId } from "mongodb";
/**
* 定义文章的接口
*/
export interface Post {
_id: ObjectId;
author: string;
title: string;
content: string;
visitedNum: number;
create: {
uid: string;
time: Date;
}
update?: {
uid: string;
time: Date;
}
}
但是我们一般在前端是用string类型的,如果前端直接使用ObjectId这个类型,那么前端的包体会很大,而且会很不方面。
思考:怎么办呢?
- 实现方式
- 在shared 中定义可以跨项目复用的类型
- 在项目中可以通过Overwirte 来复写 _id
- CRUD 接口定义 (TSRpc会在请求前自动剔除多余字段,客户端无需额外处理)
- 通过Pick、Omit、Partial 来减少类型冗余
- 前端传过来的参数直接丢给MongoDB,极大提升效率
3.3 具体实现
我们在后端项目中,创建一个DbPost.ts的文件,用来复写 _id 这个字段

而我们的Post.ts文件里,_id还是string类型

由于这个DBPost.ts 文件,没有在shared文件夹下,所以这个文件只存在于后端,前端不存在。
4. CRUD协议的实现
- PtlAddPost.ts
export interface ReqAddPost {
author: string;
title: string;
content: string;
}
export interface ResAddPost {
insertedId: string;
}
- PtlDelPost.ts
export interface ReqDelPost {
_id: string;
}
export interface ResDelPost {
deleteNum: number;
}
- PtlGetPost.ts
import {
Post } from "./models/Post";
export interface ReqGetPost {
_id: string;
}
export interface ResGetPost {
post: Post
}
- PtlUpdatePost.ts
export interface ReqUpdatePost {
_id: string;
title: string;
content: string;
}
export interface ResUpdatePost {
}
5. 使用typeScript的类型定义,解决字段冗余
主要是针对PtlAddPost.ts 和 PtlUpdatePost.ts 两个文件进行改造
- PtlAddPost.ts
import {
Post } from "./

681

被折叠的 条评论
为什么被折叠?



