现在订阅年付会员送 6 个月,重订或续订年付会员送 12 个月。(活动截止到月底)订阅 →

博客

NNC D10:定义与使用 Nest.js 应用里的内容关系

从 D10 开始往后会训练使用内容的关系。在应用里的内容与内容之间存在某种关系,比如用户与文章,文章与评论,用户与评论,分类与文章,标签与文章等等。我们需要根据关系的类型去定义这些内容与内容之间的关系,这样在创建内容的时候才能存储内容的关系,存储了内容的关系以后就可以利用内容的关系。

比如用户(User)是一种实体,文章(Post)也是应用里的一种实体。这两种实体之间存在某种关系,一个用户可以发布多个文章内容,就是可以关联多个文章内容,一个文章内容只能属于一个用户。对于用户实体来说,它跟内容是一对多(OnToMany)的关系,对于文章实体,它跟用户是多对一(ManyToOne)的关系。

在 Nest.js 应用里。在实体的定义里可以描述内容之间的这个关系,下面是在 User 实体里面,描述他跟 Post 实体的关系:

src/modules/user/user.entity.ts

学生,医生,Coder,间谍

这次训练营的成员所在地区北到黑龙江(伊春),南到广州,西到新疆(阿图什),东至上海。还有部分成员分布在北美(滑铁卢、西雅图)与澳大利亚(悉尼)。成员的职业也非常多样化,从学生到医生再到职业软件工程师。还有神秘的间谍,无形无影亦无踪。

通过最近做的线上训练营让我更加了解宁皓网的用户是谁、自学中遇到的具体问题是什么样子的。让我重新思考如何更高效的解决自学开发时遇到的障碍与疑惑。

NNC D9:在 Nest.js 应用里验证用户的身份(基于 JWT)

D9 的任务是实现一种验证用户身份的方法。用户使用客户端请求我们的服务端应用,在服务端这里有时候需要知道请求是谁发出的,这就需要验证请求用户的身份。方法有很多,这次任务会介绍一种基于 JWT 的身份验证方法。

JWT 身份验证的流程

登录

在我们的服务端应用里需要提供一个登录接口,负责处理登录请求,检查用户名与密码以后响应签发的 JWT 或异常。

首先用户要先请求登录,一般就是使用他们在应用里的用户名与密码请求登录接口。这个登录接口会检查用户提供的用户名与密码,比如先看一下用户名在应用里是否存在。如果存在,再检查这个用户提供的密码跟我们存储在应用数据库里的密码是否匹配,如果匹配,登录接口就会给这个用户签发一个 JWT,并且把这个 JWT 响应给用户的客户端。

NNC D8:在 Nest.js 应用里创建用户模块与实体

D8 的训练是在应用里添加一个用户模块,定义一个用户实体,这会在应用的数据库里对应一个数据表,来存储用户相关的数据。

Nest.js 应用可以使用模块来组织应用的结构,一般你需要一种新的实体,就可以围绕这种实体去创建一个模块。我们的应用需要处理用户资源,所以要创建一个用户实体,围绕用户实体可以再去创建一个用户模块。

下面是定义的 User 模块:

NNC D7:把客户端数据送进 Nest.js 应用的数据库

D7 的训练简单又让人兴奋,我们终端可以把客户端数据送进应用的数据库里了,还要了解一下如何提取、更新还有删除数据。TypeOrm 里面提供了一种叫 Repository 的东西,使用它可以处理数据库里的数据。

先了解一下基本的流程,首先要在模块里说明一下要用的实体的类型,然后在想要使用 Repository 的地方,要把它作为依赖注入进来,比如一般我们会在服务(Service)里使用 Repository 去处理数据,所以在定义服务类的时候,要把在这个服务里需要的 Repository 注入到这个类里面。这样就可以在这个服务里使用 Repository 上提供的方法去处理数据了,比如存储、更新、提取或者删除数据。

NNC D6:准备 Nest.js 应用的数据服务

D6 的训练一开始会去创建一个全新的 Nest.js 项目,然后配置好项目需要的数据服务,创建一个模块,模块里定义一种实体,实体上添加几个需要的数据字段。

Nest.js 框架里集成使用了 TypeORM,ORM  可以想成是一种定义与处理数据用的方法,TypeORM 是其中的一种 ORM,可以让我们用 TypeScript 或 JavaScript 处理数据库里的数据。所以暂时可以把 TypeORM 想成是一套定义与处理数据用的方法或工具,在 Nest.js 框架里集成使用了它。

往后的训练会经常用到数据的处理,所以 D6 的训练非常关键,就是准备一个可用的数据服务,然后配置好 Nest.js 框架能够正常的使用这个数据服务,比如可以通过定义实体在应用的数据库里添加一个数据表,数据表里有实体中描述的数据字段。

在训练中,我们会用 Docker 去创建一个 MySQL 数据服务,TypeORM 支持处理多种不同类型的关系型数据库,MySQL 是其中的一种。你也可以选择使用 MariaDB、PostgreSQL 等等。

Nest.js:运行了 npm run start:dev 真正做了什么

Nest.js 框架的命令行工具(nest)在本地创建了一个项目,在终端进入到这个项目所在的目录,然后运行了 npm run start:dev 命令,创建的应用就运行起来了,在编辑器里编辑项目文件,保存文件以后,应用的服务会自动重启。

命令是在哪里定义的?

Node.js 项目里面都会包含一个 package.json 文件,在这个文件里描述了项目的相关信息,比如项目的名字、作者、版本等等,这个文件还列出了项目依赖的包(Package)。Node.js 自带的 npm 这个工具可以帮我们管理项目依赖的这些包。

在 package.json 文件里面,还有一个 scripts 属性,它里面定义的就是项目里的一些命令,这些命令都有自己的名字,还有它真正要执行的是什么。

NNC D5:Nest.js 框架的核心部件(3)

D5 的训练还是跟 Nest.js 的核心部件相关,主要介绍了拦截器,自定义路由参数装饰器,还要了解一下自定义管道,这是核心部件相关训练的最后一天。

后面我们要去创建一个全新的 Nest.js 项目,主要去了解怎么把数据放到数据库里,怎么让应用帮我们把需要的数据提取出来,如何验证用户身份,还有怎么上传文件等等。

后面的训练任务会大量重复之前训练试验过的东西,所以如果之前没有跟上的同学,可以直接从 D6 开始训练。

拦截器

拦截器(Interceptors),如果你想在客户端请求到达请求处理器之前,或者请求处理器响应回数据之后,去做一些事情,就可以通过拦截器这种东西去实现。

先看一下简单的拦截器:

NNC D4:Nest.js 框架的核心部件(2)

D4 训练的是继续理解 Nest.js 框架的核心部件,管道(Pipes)还有守卫(Guards)。管道的两个主要的作用是转换与验证数据。 守卫决定了是否让请求通过。

管道

管道(Pipes),在 Nest.js 框架里,这种东西有两个主要的作用,一个是转换数据,一个是验证数据。框架里自带了两个管道,ValidationPipe 可以用来验证数据,ParseIntPipe,它可以把字符串转换成数字类型的值。

下面是一个请求处理器方法,里面用 @Body 装饰器装饰了一下 post 这个参数,这样 post 参数里的值就会是请求里的主体数据。

store(@Body() post: CreatePostDto) {}

这个数据我们设置了一个类型是 CreatePostDto,在这个类型里规定了请求主体里可能包含的数据还有对应的类型:

NNC D3:Nest.js 框架的核心部件(1)

任何应用框架里面都定义了一些核心部件的创建还有使用方法。在基于这个应用框架开发应用的时候,我们可以按照框架提供的规则去创建使用这些核心部件,它们可以给我们提供需要的一些功能。 D3 的训练就是熟悉 Nest.js 应用框架里的几个核心部分的创建还有使用方法。

服务

在控制器的方法里可以处理客户端发送的请求,比如从请求里面提取需要用到的一些数据。再写一些代码来处理请求,可以把这些代码称为处理请求用的逻辑,其实就是一些操作。一般我们不把这些逻辑直接放在控制器的方法里面,而是放在一种叫服务(Services)的东西里面。

一般一个控制器可以对应一个或多个服务,在这个服务类里面添加需要用到的一些方法,这些方法里面包含了处理请求需要的逻辑代码,然后把这个服务作为控制器的依赖注入到这个控制器里面使用。

模块

模块(Modules)在 Nest.js 框架里可以作为一种组织代码的结构,我们可以根据应用的某些属性把应用提供的功能划分成多个模块,每个模块里可以包含一些东西,比如控制器、服务、实体等等。在模块的定义里面,可以导出一些功能,这些功能在应用的其它模块里可以导入使用。



微信好友

用微信扫描二维码,
加我好友。



微信公众号

用微信扫描二维码,
订阅宁皓网公众号。



240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

10872
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点