前端技术圈发展得太快,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 。(吐了吐了,官方也不管了,虽然问题不大,但是少了点灵活性。)
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!