前端技术圈发展得太快,Vue3 进入最后的准备状态,而 React + hooks api + TS 已经香遍所有新项目中。TypeScript 从受欢迎的程度以及新项目的使用率也可以了解到 TS 将会成为前端工程化的标配语言。(拾人牙慧。我还没开始学,还不知道好不好。)

  接下来我将会去往学习 TS ,再通过 Nest.js 的后端框架进行项目实践(完成一个多功能的 CMS)。学习路线是 TS -> 简单的 node.js -> Nest.js 的边开发边学习方式。

  不过这次项目会往一个成熟的工程化发展,不会只是用个 pm2 部署了就完事,而是参考企业常规软件架构引入 CI/CD 的模式,以尽可能的方式达到企业级标准!

说到底还不是为了加薪!!!!!!!!!!!

TypeScript

参考学习资料:掘金收费电子书 https://juejin.im/book/5da08714518825520e6bb810

可能不会急着去写关于 TS 的知识点。后期会通过在学习 nestjs 过程中去对 TS 进行补充,因为 TS 可以混合 JS 进行编写,所以不会像别人的电子书一样去 copy 一份就算了。还是需要根据实际的开发体验进行知识点的更新。

Nest.js

我觉得初学这款框架需要先了解一些概念以及一些 crud 操作尽可能达到快速上手开发。例如:

1,module (模块概念)

在 nestjs 里 module 包括 service 、controller 、provider。

其中 service、controller 很好理解。(学过后端的都知道,不赘述)

那么 provider 是 nestjs 的一个新概念。
它可以通过 provider 对一些可复用的功能代码如:service、controller、pipe、middleware、guard 等等进行复用,那么通过 provider 对功能代码进行注册后其子模块(module)即可使用这些功能代码。

关于 imports

但是你还是得通过 import 去声明后才能直接使用(好听点就是让代码更直观,难听点就是个坑,明明子模块都能用了,凭什么还要我再引入一次???)。

2,pipe (管道或中间件概念)

我目前用到 pipe 主要用作为全局的异常转换工具。与 exception filter 配合使用。通过与 class-validator 对 DTO 进行类型验证,一旦有误,就立刻报 badRequest ,exception filter 里直接对返回体进行控制,保证不出现返回一串 html 的 500 报告。

PS:需要注意一点的是 class-validator 的验证过程是一直验证下去,即使发生异常也不会停下来,所以返回的异常信息至少>=1。尽管官方 issues 区有多人反馈,还是未能解决这个问题(吐了)。所以你需要自行在 pipe 中控制只返回一个 message 即可。(如果你想让你的返回体结构统一的话就这么做)

个人觉得和 koa2 的中间件(middleware)相比,由于 koa2 自身有 “洋葱模型” 中间件来回都会调用,而 express 却是单向的,那我觉得 filter 是弥补 express 的中间件不能往回调用的填坑操作。

3,crud (使用装饰器做到增删改查,但不连接数据库)

如何编写一个固定格式的 response 返回体?(http 请求的成功与失败的实现方式不同)

如何设置路由全局前缀(prefix)?

如何做类型判断?以及优雅的类型转换?

貌似 class-validator 不能做到遇到一个 Error 就停止校验,而是一直执行下去

dto 的类型设置好像没有对 request 有限制?

嵌套的 dto 该怎么写?

4,连接 mongoDB 数据实现真实的 crud 。

5,利用 swagger 编写 api 文档

由于官方的 @nest/swagger 文档比较随意,示例代码几乎没有,而且有些属性还不能生效(issues 区有提到,但未改),我这里会出示例项目常用的、以及填坑用的方法。

常用的标注信息:

1,给 controller 打 tag(标签),即对接口进行分类。

在 controller 类 上加 @ApiTags(“你的标签”)

2,给 api 接口添加说明

在 controller 的方法上 @ApiOperation({ summary: “这个 api 是干嘛的?” })

3,给接口添加默认参数

Query

@ApiQuery({ name: "id", description: "接口描述", example: "你的默认值" }) // 注意 example 是 any 类型

Param (即路由参数如:user/{id})

@ApiParam({ name: "id", description: "id 路由", example: 1 })

Body

  @ApiBody({
    schema: {
      example: {
        account: "JJLao",
        password: "123456"
      }
    }
  })

Header 注意:如果在同一个 header 下使用 @ApiSecurity() 的优先级比 @ApiHeader() 要高

// 注意:这里不可以直接使用 defalut 而是通过 schema 的方式区设置默认值(貌似官方不管了)
@ApiHeader({ name: "token", description: "令牌", schema: { default: 12580 } })

如何自动带鉴权 token ? (有坑,但问题不大)

在 main.ts 配置

// swagger 相关配置
  const docOptions = new DocumentBuilder()
    .setTitle("Nest practise")
    .setDescription("Nest.js 练习用 api")
    .setVersion("1.0")
    // 关键点在这里。 第一个 token 是标题,第二个 token 是 header 的 key
    .addSecurity("token", { type: "apiKey", name: "token", in: "header" })
    .build();
  const document = SwaggerModule.createDocument(app, docOptions);
  SwaggerModule.setup("api-docs", app, document);

然后就需要在各个 controller 的类上添加

@ApiSecurity("token")

即可,代表该 controller 自动添加 token 。(吐了吐了,官方也不管了,虽然问题不大,但是少了点灵活性。)



TS TypeScript Nest.js

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!