TSRpc 框架学习4----使用mongoDB来做一个CRUD例子

  • 经过前面几篇的学习,我们已经大致了解了TSRpc的代码结构,和特性,也自己写了一个例子,接下来我们开始写一个完整的业务逻辑。

由于 mongoDB 天然支持json类型,所以它也就成了我们使用TSRpc框架的首选数据库

1. 需求场景

下面是一个很常见的需求场景。
在这里插入图片描述

2. 定义协议

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

2.1 创建用于CRUD的四个协议文件

在这里插入图片描述

2.2 定义统一类型Post

由于这几个接口都是针对了Post(文章)这个对象,我们也把这个对象单独抽出来定义。
在这里插入图片描述
每个字段的意思,直接看单词就能明白,这里也就不写字段的注释了。

2.3 Post对象的优化

由于对象中的 createUid createTimeupdateUid 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就必须传入uidtime 字段,而update 就必须传入uidtime 字段,我们在类型定义的时候,就最大的规避了一些在开发中可能遇到的问题。

但是这样的定义方式,如果使用其他数据库存储,它的查询会比较麻烦,但是用mongoDB这种天生支持json的数据库就会很合适,所以这里推荐使用mongoDB来存储。

3. 难点和挑战

  • MongoDB 的ObjectID 类型无法在前端引用
  • 如何尽可能减少类型冗余
  • 安全:如何限制参数字段

3.1 先安装mongoDB 和 TypeScript

  • 安装mongoDB
    安装mongoDB
  • 安装TypeScript
    安装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这个类型,那么前端的包体会很大,而且会很不方面。
思考:怎么办呢?

  • 实现方式
  1. 在shared 中定义可以跨项目复用的类型
  2. 在项目中可以通过Overwirte 来复写 _id
  3. CRUD 接口定义 (TSRpc会在请求前自动剔除多余字段,客户端无需额外处理)
  4. 通过Pick、Omit、Partial 来减少类型冗余
  5. 前端传过来的参数直接丢给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.tsPtlUpdatePost.ts 两个文件进行改造

  • PtlAddPost.ts
import {
   
    Post } from "./
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值