🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余11个优惠名额) →

博客

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

NNC D2:请求与响应(理解客户端与服务端的沟通方式)

我们要开发的是一个可以为前端、移动端提供后台服务的服务端应用,就是最终开发的这个应用是要在一台或一群服务器上运行的。前端、移动端等等可以统称为 “客户端”,因为应用的“客户(用户)”都是在这些端上使用我们的应用。

也就是客户端应用一般都提供了一套用户界面,用户可以通过应用的界面使用我们的应用。客户端需要服务端提供的服务,比如在客户端上要显示数据,客户端需要到服务端那里请求获取到。要存储用户在客户端上产生的数据,比如用户输入的文字内容、要上传的图片,这些数据都要从客户端发送到服务端那里处理,服务端会把这些数据存储到相应的地方,比如应用的数据库,或者文件存储服务等等。

再比如用户在客户端上要用他选择的方式进行支付,客户端会把这个支付任务告诉给服务端应用。服务端收到了这个任务,会做一些处理,组织好支付需要的一些东西,然后服务端可以把处理好的东西再交给客户端,客户端会做进一步操作,或者服务端可能会直接向支付服务请求支付,再把支付结果交给客户端。

总之,服务端应用就是提供各种服务,能做各种事情的应用,在客户端上解决不了的事情你都可以交给服务端去处理,当然,这个服务端应用你得自己开发才能提供你需要的服务。我们接下来要做的就是去看看如何开发这种服务端应用。

NNC D1:准备训练( Nest.js 的开发工具与环境)

这次训练营的目的是训练开发一个基于 Nest.js 应用框架的服务端应用。Nest.js 这个框架是基于 Node.js 的,所以应用的开发环境就是去安装一个 Node.js。第一天的训练任务是去准备 Node.js 应用的开发工具与开发环境。

工具

  1. Terminal(macOS) / Cmder(Windows):命令行界面
  2. VSCode:代码编辑器
  3. Git:源代码管理工具
  4. Insomnia:HTTP 客户端
  5. TablePlus:数据库客户端

环境

  1. Node.js
  2. Docker / MySQL

常见问题

Docker 桌面版对 Windows 系统的要求挺高,需要 Windows 10 专业版、企业版,同时要开启系统的 Hyper-V 才可以。我们用 Docker 主要去给要开发的应用创建一个 MySQL 数据服务来存储应用的数据。如果发现不能使用 Docker,可以直接在本地电脑上安装一个 MySQL,或者使用任何你有权限控制的 MySQL 数据库,比如在远程服务器上的数据库。

用 Docker Compose 搭建 Node.js 应用(Nest.js)的本地开发环境

最近同学们在练习中遇到很多问题都跟开发环境有关,虽然开发 Node.js 应用只需要安装一个 Node.js,我也建议大家安装跟练习中同样的版本,但依赖存在大量的变数,因为操作系统不同、网络环境不同、安装的方式不同等等。这些变数导致遇到了各种各样的问题。

很多问题跟权限有关,有位同学试了很多次就是无法创建项目,我通过远程协助,发现问题是因为 npm 的缓存引起的,清除缓存以后,重新再去创建项目就可以了。

如果使用官网下载的安装包安装的 Node.js ,用 npm 在全局范围安装命令的时候就会遇到权限问题,因为在全局安装的这个命令,会存储在系统的某个地方,当前用户对这个地方有可能是没有权限的。解决的方法是使用 NVM 管理在系统上的 Node.js,或者手工通过配置修改 npm 在全局范围安装包的目录,换成对当前用户来说有权限的目录就行了。

Netflix 剧中出现 VSCode 编辑器与 Nest.js 框架的代码

在 Netflix 出的一部剧《不要在家里尝试》的第一季第二集里,男主角一夜之间用 VSCode 编辑器,做了一个 Nest.js 服务端应用还有一个 Vue.js 前端应用。这部剧的另外一个名字比较危险,不能乱用。

我有个想法,创造个应用在网上卖点东西!

让我在 VSCode 编辑器上整理一下思路。

NinghaoNodeCamp2019:提交训练任务代码

你要对训练中开发的应用项目做源代码管理,在训练视频中介绍了具体的方法。要为项目添加一个远程仓库,开始一组训练前可能需要创建一个新的分支(branch),每完成一个任务你都要做一次提交(commit),提交信息必须设置成所完成的任务的名字。

完成当天的训练任务以后,把做的提交要推送(push)到项目的远程仓库的上面(下面会解释相关的概念与具体的方法)。我们会根据你在训练中推送到远程仓库上的代码来判断你是否正确地完成了所有的训练。

相关概念

源代码管理 / 版本控制

源代码管理(Source Control),有时候也叫版本控制(Version Control)。在开发应用的时候,需要对项目做源代码管理,源代码管理主要做的就是使用一些有效的方法,记录项目的每一次变化,现在最常用的源代码管理工具叫 Git,它是开发者的必备工具。

NinghaoNodeCamp2019:训练准备、目标与方法

你成就的所有事情,首先就是做了一个小小的决定,然后伴随着一个又一个的决定,每个决定又跟着一些要完成的动作或任务,一段时间以后,神奇的事情就发生了。

所有伟大的,看起来不可能的事情都是这样实现的,就是由一个个细小的决定组合而成。这是前两天我从偶然看到的一个 TED 演讲中得到的启发,我觉得我们 “英雄” 所见略同:)

其实古人早就已经给我们总结了这个方法,“不积跬步,无以至千里;不积小流,无以成江海。”,上学的时候我们都读过这句话,只不过只是把它当作一句普通的话,其实这就是成就所有事情的秘籍。

我们认为难做的事情,难学的东西,可能不是因为事情难做,东西难学,而是一种捷径心理。我们都希望能通过某种方法或捷径,一下子就把事情做成了,一口气就把东西学会了。比如用一道公式解决英语学习

有时候我们是被事情本身吓到了,如果把它当作一个整体来看,的确挺吓人的。但是,当把它分解成一块一块的小任务,每个小任务全都可执行,这样就没那么可怕了,因为你知道,只要一个一个的把这些小任务全部都完成就行了。整体可怕,小块可行。

NinghaoNodeCamp 2019:英文单词(按出现频次排列)

在这次训练营中,出现了 5000+ 次英文单词,去掉重复以后还剩几百个,很多单词在不同的语境下表示不同的含义。单词的大小写不同,或者撰写的形式不同,可能表示不同的东西。

比如 post 这个词,如果是 POST 指的是 HTTP 协议里的一种请求方法,如果是 @Post,指的是框架里的一个装饰器,如果是 Post 指的是我们自定义的一种内容实体,表示文章,posts 表示一组文章,posts 也经常出现在内容的地址里,比如 /posts,或 /posts/3。

单词后面的数字,表示这个单词在所有训练中出现的次数。比如 id 294,说明这个词出现了 294 次。

微信好友

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

微信公众号

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

240746680

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

统计

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

社会化网络

关于

微信订阅号

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