🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名 →

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

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

服务

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

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

模块

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

Nest.js 应用有一个主模块,或者叫根模块(Root),这个模块是在 app.module 文件里定义的,在应用里创建的所有其它的模块都必须要在这个主模块里导入,有点像是注册一下,如果不导入这些模块, Nest.js 并不会知道我们创建的模块,应用也就无法提供我们创建的模块里面的功能。

src/app.module.ts:

import { PostsModule } from './modules/posts/posts.module';
@Module({
  imports: [PostsModule]
})

上面是个示例,比如在应用里我们自己创建了一个叫 Posts 的模块,这样在 app.module.ts 这个文件的一开始,先要导入创建的这个模块。然后在 @Module 的 imports 里面,要把导入进来的 PostsModule 添加进来。

src/modules/posts/posts.module.ts:

import { Module } from '@nestjs/common';
import { PostsController } from './posts.controller';
import { DemoService } from './providers/demo/demo.service';

@Module({
  controllers: [PostsController],
  providers: [DemoService]
})
export class PostsModule {}

上面是一个自定义的模块,在这个模块里导入使用了模块里面需要的一些东西,比如 PostsController、DemoService。

中间件

中间件(Middlewares)就是在请求与请求处理器之间的一种东西,它会在请求到达请求处理器之前被调用。也就是如果你想让请求在到达请求处理器之前,去处理一下这个请求,或者检查一下这个请求,在请求上添加点东西,就可以创建一个中间件,然后在这个中间件里去设计你需要的动作。

在 Nest.js 里面,一般空白的中间件,就是什么事都没做的中间件,看起来像下面这样:

import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class DemoMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    next();
  }
}

在中间件里可以得到 req 请求,还有 res 响应。中间件里要执行 next ,这样应用会继续调用其它的中间件。在这个中间件里,你想做的事情,可以把它们放在 use 这个方法里面的 next() 的上面,比如简单的在控制台上输出一个 hello 。

  use(req: any, res: any, next: () => void) {
    console.log('hello');
    next();
  }

在 AppModule 里面,用一下定义的中间件:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { DemoMiddleware } from './core/middlewares/demo.middleware';
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(DemoMiddleware)
      .forRoutes('posts');
  }
}

在模块里你得先导入自己定义的中间件,然后让模块类 implements 一下 NestModule,这个东西来自 @nestjs/common,在模块类里添加一个 configure 方法,里面有个 consumer 参数,在这个方法里用一下 consumer 上的 apply 方法,把需要用在这个模块上的中间件交给这个方法,接着再用一下 forRoutes 方法,去设置这个中间件要使用在哪个路由上。

现在如果访问 posts 这个路由地址的时候,在控制台上就会输出一个 hello,因为这是 DemoMiddleware 这个中间件要做的事情。

异常过滤器

应用在运行的时候一定会遇到各种各样的异常情况,我们要根据需要去处理这些异常情况,就是我们要设计一下,如果应用里面出现了什么样的异常,应用要去做什么样的事情。

比如一个用户在客户端那里请求查看一篇文章内容,服务端应用收到了这个请求,到数据库里去给用户找这篇文章,但发现这篇文章不见了,或者在查询数据库的时候,数据库服务断掉了,不能连接到数据库,这种情况就是应用里面出现的异常情况。出现这种情况我们的应用要有能力继续为用户提供服务,比如给用户的客户端做出一个回应,告诉它应用的数据服务暂时无法使用,或者告诉用户没有找到他想要的文章内容。

Nest.js 框架里自带了一个异常处理,可以处理一些的异常情况。很多时候我们希望能定制处理各种不同类型的异常情况,这就需要我们去创建自己的异常处理功能。在 Nest.js 框架里,这种东西叫 “异常过滤器” (Exception filters)。自己创建的异常过滤器,可以用在指定的地方,一般就是某个路由处理方法或者某个控制器的上面,也可以用在应用的全局。

微信好友

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

微信公众号

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

240746680

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

统计

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

社会化网络

关于

微信订阅号

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