首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NestJS -在拦截器(非全局拦截器)内部使用服务

基础概念

NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它基于 Express.js 和 Fastify,并且使用了现代 JavaScript 或 TypeScript。拦截器(Interceptor)是 NestJS 中的一个核心概念,允许你在方法调用前后执行自定义逻辑。

相关优势

  1. 代码复用:拦截器可以在多个控制器或方法之间共享逻辑,减少重复代码。
  2. 灵活性:可以在请求处理的不同阶段插入自定义逻辑,如日志记录、错误处理、数据转换等。
  3. 解耦:拦截器将横切关注点与业务逻辑分离,使代码更加清晰和易于维护。

类型与应用场景

类型

  • 全局拦截器:应用于整个应用程序的所有请求。
  • 控制器拦截器:应用于特定控制器的所有方法。
  • 方法拦截器:仅应用于单个方法。

应用场景

  • 日志记录:记录请求和响应的详细信息。
  • 身份验证:在处理请求前验证用户身份。
  • 数据转换:在发送响应前格式化数据。
  • 异常处理:统一处理控制器中的异常。

在拦截器内部使用服务

在 NestJS 中,拦截器可以注入并使用服务。以下是如何在非全局拦截器内部使用服务的示例:

示例代码

假设我们有一个 LoggingService 用于记录日志:

代码语言:txt
复制
import { Injectable } from '@nestjs/common';

@Injectable()
export class LoggingService {
  log(message: string) {
    console.log(`[LOG]: ${message}`);
  }
}

接下来,创建一个拦截器 LoggingInterceptor 并在其中使用 LoggingService

代码语言:txt
复制
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { LoggingService } from './logging.service';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  constructor(private readonly loggingService: LoggingService) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => {
          this.loggingService.log(`${context.getClass().name}.${context.getHandler().name} ${Date.now() - now}ms`);
        }),
      );
  }
}

在控制器中使用这个拦截器:

代码语言:txt
复制
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { LoggingInterceptor } from './logging.interceptor';
import { LoggingService } from './logging.service';

@Controller('example')
export class ExampleController {
  constructor(private readonly loggingService: LoggingService) {}

  @Get()
  @UseInterceptors(new LoggingInterceptor(this.loggingService))
  getExample() {
    return 'This is an example response';
  }
}

遇到的问题及解决方法

问题:拦截器无法注入服务

原因:可能是因为拦截器没有正确地通过依赖注入获取服务实例。

解决方法

  1. 确保 LoggingService 已经在模块中声明并提供。
  2. 在拦截器构造函数中正确注入服务。
代码语言:txt
复制
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  constructor(private readonly loggingService: LoggingService) {}
  // ...
}
  1. 如果使用模块化的方式,确保在模块中导入并提供 LoggingService
代码语言:txt
复制
import { Module } from '@nestjs/common';
import { ExampleController } from './example.controller';
import { LoggingInterceptor } from './logging.interceptor';
import { LoggingService } from './logging.service';

@Module({
  controllers: [ExampleController],
  providers: [LoggingService, LoggingInterceptor],
})
export class ExampleModule {}

通过以上步骤,可以确保拦截器能够正确地使用服务,并在方法调用前后执行自定义逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NestJS中使用拦截器

在NestJS中,拦截器是一种强大的工具,可以用来在请求处理的不同阶段执行一些操作。拦截器可以用于日志记录、验证、转换请求和响应等任务。今天就看看如何在NestJS中使用拦截器。 什么是拦截器?...如何使用拦截器? 要使用拦截器,需要在模块的providers数组中注册它,并在需要使用它的路由处理器或控制器上添加@UseInterceptors装饰器。...中注册了LoggingInterceptor,并将其作为全局拦截器使用。...也可以在特定的路由处理器或控制器上使用@UseInterceptors装饰器来应用拦截器,比如: import { Controller, Get, UseInterceptors } from '@nestjs...总结 拦截器是NestJS中一个非常强大的工具,可以用于在请求处理的不同阶段执行一些操作。

12910
  • nestjs搭建HTTP与WebSocket服务

    最近在做一款轻量级IM产品,后端技术栈框架使用了nodejs + nestjs作为服务端。.../common/return-code"; /** * 全局Http服务响应拦截器 * 该Interceptor在main中通过 * app.useGlobalInterceptors 来全局引入...在本例中,我们选择使用socket.io作为nestjs上WebSocket具体的实现,因为socket.io是一个比较著名websocket库,同时支持服务端和客户端,并且在客户端/服务端均内建支持了...成功响应拦截器 对于集成在nestjs中的WebSocket服务,想要编写并配置一个成功响应拦截器并不复杂,没有什么坑。.../common/return-code"; /** * 全局WebSocket服务响应拦截器 * 该Interceptor在网关中通过装饰器 @UseInterceptors 使用 * 仅处理WebSocket

    74930

    BFF与Nestjs实战

    bff和node没有强绑定关系,但让前端人员去熟悉node之外的后端语言学习成本太高,所以技术栈上我们使用node作为中间层,node的http框架我们使用的是nestjs。...适用场景 BFF虽然比较流行,但不能为了流行而使用,要满足一定的场景并且基建很完善的情况下才使用,否则只会增加项目维护成本和风险,收益却非常小,我认为的适用场景如下: 后端有稳定的领域服务,需要聚合层...常用模块 通过阅读上文我们了解了跑通一个服务的流程和nestjs的接口是如何相应数据的,但还有很多细节没有讲,比如大量装饰器(@Get,@Req等)的使用,下文将为大家讲解Nestjs常用的模块 基础功能...中常用的功能,它内部提供了一些常用的请求体的装饰器,我们也可以自定义装饰器,你可以在任何你想要的地方很方便地使用它。...拦截器具有一系列有用的功能,它们可以: 在函数执行之前/之后绑定额外的逻辑 转换从函数返回的结果 转换从函数抛出的异常 扩展基本函数行为 根据所选条件完全重写函数 (例如, 缓存目的) 下面我们实现一个响应拦截器来格式化全局响应的数据

    2.7K10

    Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志

    这时候我们可以考虑使用 拦截器 来实现。什么是拦截器?拦截器 是使用 @Injectable() 装饰器注解的类。拦截器应该实现 NestInterceptor 接口。...{ this.operationLogService.logAction(); return next.handle().pipe(map((data) => data)); }}绑定拦截器在需要绑定的...Controller 中使用 @UseInterceptors() 装饰器,与守卫一样, 拦截器可以是控制器范围内的, 方法范围内的或者全局范围内的。...';@UseInterceptors(LoggingInterceptor)export class UserManageController {}在绑定拦截器后,用户每次调用 Controller 中的路由处理程序都将使用...效果演示总结这个功能本来一开始我是想使用 中间件 来开发的,后来不管怎么折腾,中间件 的 Request 上下文始终获取不到 Session,但 拦截器 也不失是一种好方法。

    22710

    如何更好的在 react 中使用 axios 的拦截器

    但是 在 react 中,axios 并不是完全作为第三方工具,它的拦截器应该被定义为服务,即 react 中的副作用代码。...假如你的 axios 封装是基于状态库,或者第三方组件,那么你应该使用服务片段 AjaxEffectFragment,把服务片段填充到依赖组件的内部。这是推荐的。...如何使用 举个两个最经典的例子: 在 axios 拦截器中消费上下文,使用 useContext 在 axios 中使用第三方路由 React Router 消费上下文 在 react 中,...详见最后一节 axios 拦截器封闭性。 当然你也不必强制在 useLog 中使用 useRef 从而实现导出实时的更新日志功能,大可以让调用此库的服务自行进行 状态跟踪。...状态丢失 这个问题让我踩了一个大坑,例如上面两个例子中,我都对拦截器依赖的功能使用 Ref 进行参考调用,如果直接使用非引用的函数,例如日志记录例子中更新日志的 update 函数,或者路由跳转例子中的

    2.6K30

    快速打开 Nestjs 的世界

    ; 学习提供者的使用 图片来自:docs.nestjs.com/providers 在 Nestjs 中将提供服务的类及一些工厂类、助手类等称作提供者,它们同时均可以通过注入的方式作为依赖模块; 创建服务..., }, ], }) export class AppModule {} 学习守卫的使用 图片来自:docs.nestjs.com/guards 在服务运行时根据特定的条件来允许或阻止请求是否要被路由程序处理的任务是由守卫承担...图片来自:docs.nestjs.com/interceptor… 拦截器是一个 APO 切面编程技术,应用拦截器可以获得下面所列出的一系列能力: 在方法执行之前/之后绑定额外的逻辑 转换函数返回的结果...转换函数抛出的异常 扩展基本功能行为 根据特定条件完全覆盖函数(例如,出于缓存目的) 统计处理函数执行时间 使用拦截器在不侵入处理函数的前提下计算处理函数执行的时长,这是一个典型的切面编程案例。...${Date.now() - now}ms`))); } } 在拦截器中使用到了Rxj 技术,在tap运算符将在处理函数执行结束后计算所执行的时间。

    55810

    Node版Spring - 那些让人眼前一亮的NestJS特性

    点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 Nestjs的哲学:完全支持Typescript并解决架构问题,在服务器端提供开箱即用的应用架构,让开发人员和团队能够创造出高可测试...本文主要谈及一些和其他node框架稍微差异的特性,比如依赖注入、控制器、管道、拦截器、模块、微服务。...里使用CatsService不是通过使用New来实例化, 而是在constuctor声明即可。...,但是在微服务流行的情况下,模块的作用就不是很大了。...五、微服务 ? Microservices_1 Nest 支持几种内置的传输层实现,称为传输器,负责在不同的微服务实例之间传输消息。大多数传输器本机都支持请求 - 响应和基于事件的消息样式。

    2.1K30

    NestJS 7.x 折腾记: (6) 异常过滤器,取其精华去其糟粕!比如响应异常数据的包装~

    NestJS提供了一波拿来即用的内置异常过滤器; 在@nestjs/common里面,搜索下Exception就有~ 我们来一个具体的例子(全局异常过滤), 基于内置的异常过滤器实现,采用第三方日志(pino...export class HttpExceptionFilter implements ExceptionFilter { // 我们要把异常塞到自定义logger,必须引入对应的实例 // 在构建函数声明定义下...Response>(); // 请求体 const request = ctx.getRequest(); // 判断状态是否为请求异常,否则直接抛回来服务内部错误...await app.listen(configService.get('SERVE_LISTENER_PORT')); } bootstrap() app.module.ts 若是只要特定模块生效可以使用...Providers去实现,从核心模块导出; import { Module } from '@nestjs/common'; // 包括网关,拦截器都可以走这种模式!

    1.2K20

    Nest.js 实战系列四:使用中间件、拦截器、过滤器打造日志系统

    main.ts 中引入,使用 useGlobalInterceptors 调用全局拦截器: import { NestFactory } from '@nestjs/core'; import { AppModule...})); // For parsing application/x-www-form-urlencoded // 监听所有的请求路由,并打印日志 app.use(logger); // 使用全局拦截器打印出参...这样就会有隐患了,用户在使用过程中报错了,但是日志没有记录报错的原因,就无法统计影响范围,如果是简单的报错还好,如果涉及数据库各种事务或者并发问题,就很难追踪定位了,总不能一直看着控制台吧。...HTTP 异常 app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000); } bootstrap(); 使用全局过滤器...总结 本篇介绍了如何使用 log4js 来管理日志,制作中间件和拦截器对入参出参进行记录,以及使用过滤器对异常进行处理。 文中日志的打印格式可以按照自己喜好进行排版,不一定局限于此。

    5.9K20

    Nest.js 从零到壹系列(四):使用中间件、拦截器、过滤器打造日志系统

    main.ts 中引入,使用 useGlobalInterceptors 调用全局拦截器: import { NestFactory } from '@nestjs/core'; import { AppModule...})); // For parsing application/x-www-form-urlencoded // 监听所有的请求路由,并打印日志 app.use(logger); // 使用全局拦截器打印出参...这样就会有隐患了,用户在使用过程中报错了,但是日志没有记录报错的原因,就无法统计影响范围,如果是简单的报错还好,如果涉及数据库各种事务或者并发问题,就很难追踪定位了,总不能一直看着控制台吧。...HTTP 异常 app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000); } bootstrap(); 使用全局过滤器...总结 本篇介绍了如何使用 log4js 来管理日志,制作中间件和拦截器对入参出参进行记录,以及使用过滤器对异常进行处理。 文中日志的打印格式可以按照自己喜好进行排版,不一定局限于此。

    6.6K73

    【Nest教程】Nest项目配置http和https

    Nest项目设置http和https服务 一般,我们的项目如果不是有特别需要,是不会去考虑https的,但是在某些情况下,如,你打算把你的程序发布在微信上,就必须配置https,今天我们就结合前面的教程.../filters/http-exception.filter'; // 自定义拦截器 import { TransformInterceptor } from '....app.useGlobalInterceptors(new TransformInterceptor()); app.useGlobalPipes(new ValidationPipe()); //开启一个全局验证管道...setDescription('系统接口文档') // 文档介绍 .setVersion('1.0.0') // 文档版本 .build(); // 为了创建完整的文档(具有定义的HTTP路由),我们使用类的...3 运行项目 如果不会部署,那简单,你的项目文件直接放到服务器上,然后build,用node运行下main.js,此种方式关闭窗口程序就会停止运行,所以只适合测试用。 然后访问接口地址。 ?

    3.7K1411

    【Nest教程】自定义拦截器处理处理响应数据

    拦截器(Interceptors)是一个使用 @Injectable() 装饰的类,它必须实现 NestInterceptor 接口。...今天我们讲下自定义拦截器,Nest拦截器功能很强大,可以在函数执行之前/之后绑定额外的逻辑、转换从函数返回的结果、转换从函数抛出的异常、扩展基本函数行为等。...我们在之前的项目基础上增加自定义拦截器,转换从函数返回的结果。...1 创建自定义拦截器 我们在我们项目目录src下新建interceptor文件夹,文件夹下新建transform.interceptor.ts文件,文件内容如下: import { Injectable...2 项目绑定自定义拦截器 绑定拦截器也是比较简单,我们在项目src目录下,main.ts文件导入我们新建的文件,绑定即可 import { NestFactory } from '@nestjs/core

    1.7K1412

    学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

    为什么选择Nest.js 前面也说了, 大家都说香啊~ 其次,我之前也使用过Egg.js,19年使用的时候,感觉egg约束性比较强,但是对于内部统一规范还是有好处的,但现在2021了, 已经习惯了TS,...在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !...,向客户端返回响应,将具体业务逻辑委托给providers处理; imports:导入模块的列表,如果需要使用其他模块的服务,需要通过这里导入; exports:导出服务的列表,供其他模块导入使用。...拦截成功的返回数据 首先使用命令创建一个拦截器: nest g interceptor core/interceptor/transform 拦截器代码实现: import {CallHandler,...bootstrap() { const app = await NestFactory.create(AppModule); ... // 全局注册拦截器

    14.6K65

    学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

    为什么选择Nest.js 前面也说了, 大家都说香啊~ 其次,我之前也使用过Egg.js,19年使用的时候,感觉egg约束性比较强,但是对于内部统一规范还是有好处的,但现在2021了, 已经习惯了TS,...在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !...,向客户端返回响应,将具体业务逻辑委托给providers处理; imports:导入模块的列表,如果需要使用其他模块的服务,需要通过这里导入; exports:导出服务的列表,供其他模块导入使用。...拦截成功的返回数据 首先使用命令创建一个拦截器: nest g interceptor core/interceptor/transform 复制代码 拦截器代码实现: import {CallHandler...bootstrap() { const app = await NestFactory.create(AppModule); ... // 全局注册拦截器

    10.5K11

    【Nest教程】数据验证class-validator

    通过前面几章节,我们项目的基础已经出来了,增加自定义过滤器和拦截器,连接MySQL,但是只能说是基础,因为很多功能我们都没有实现,今天实现的功能是对前台传入的字段进行验证。...1 项目安装 yarn add class-validator 2 全局验证通道 对比前面的教程,可以看出这个问文件,只添加两行代码,一行是导入ValidationPipe ,另一行是开启一个全局验证通道...import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import...app.useGlobalInterceptors(new TransformInterceptor()); app.useGlobalPipes(new ValidationPipe()); //开启一个全局验证管道...await app.listen(3000); } bootstrap(); 3 使用class-validator 为了项目统一管理,我们在之前的User模块下,新建Dto文件夹,这里面放置我们的文件

    2.1K1311

    Nest.js Cli 详细讲解

    它提供了一组命令,可以帮助开发人员快速生成模块、控制器、服务等代码文件,并且可以自动安装所需的依赖项。...linting 和格式化代码使用 Nest CLI 可以大大提高开发效率,让开发人员更专注于业务逻辑的实现,而不是手动创建和管理代码文件。...nest-cli.json在 Nest 项目中,nest-cli.json 是一个用于配置 Nest CLI 的工具文件。该文件允许您自定义 Nest CLI 的行为和设置。...g gu book //创建一个 book 守卫nest g in book //创建一个 book 拦截器nest g f book //创建一个book 过滤器nest 还提供了一个指令...,可以快速生成上面文件nest g resource book并且所有用过指令创建的文件都会自动注入到 全局模块当中,供其它模块使用后续持续更新Nest 专栏~ !

    70762

    Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0

    本文由图雀社区认证作者 布拉德特皮 写作而成 上一篇介绍了如何使用 DTO 和管道对入参进行验证,接下来介绍一下如何用拦截器,实现后台管理系统中最复杂、也最令人头疼的 RBAC。...在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。 2....验证 这是之前注册的用户表,在没有修改权限的情况下,角色 role 都是 3: ? 先往商品表插入一些数据: ? 我将使用 nodejs 用户登录,并请求查询接口: ?...总结 本篇介绍了 RBAC 的概念,以及如何使用拦截器和守卫实现 RBAC 0,原理简单到 15 行代码就搞定了。...但万变不离其宗,基本就是在拦截器或守卫里做文章,用户登录后,将权限列表缓存起来(可以是 Redis),这样就不用每次都查表去判断有没有权限访问路由了。

    3.5K30

    前端小白玩转koa(一)

    Koa 作为 Express 的后继者,Koa 在异步操作处理和中间件机制上更加先进,通过使用 async/await 语法,让异步代码的编写更加直观,采用洋葱模型的中间件,使请求和响应的处理更加灵活。...NestJS 简介:NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。...例如,在控制器中注入服务: import { Controller, Get } from '@nestjs/common'; import { CatsService } from...特点: 配置驱动开发:使用配置对象来定义服务器设置、路由、插件等。...ps:这里2年前用koa写的了,现在公司在使用NestJS,所有后续还会用NestJS重构一下,体验不同框架之间的差别和优劣、开发体验等等 开发微信小程序(记账小程序&h5通用api) 为什么写记账功能

    13720
    领券