Nest.js 中的拦截器、中间件和过滤器有什么区别

typescriptJS

2个回答

写回答

爪8

2025-09-17 19:07

+ 关注

JS
JS

Nest.JS 是一个用于构建高效、可扩展的 Node.JS 服务器端应用程序的框架。在 Nest.JS 中,拦截器、中间件和过滤器是三种不同的概念,用于处理请求和响应的不同阶段。虽然它们有些相似,但它们在功能和用法上有一些区别。

拦截器是一种用于在请求处理管道中对请求进行处理的机制。它们可以在请求到达处理程序之前或之后对请求进行修改。拦截器在执行请求处理程序之前和之后都可以拦截请求,并可以修改请求的数据、处理错误或执行其他操作。拦截器提供了一种跨请求的通用处理机制,可以在多个请求处理程序之间共享代码逻辑。

下面是一个使用拦截器的示例代码:

typescript

@Injectable()

class LoggingInterceptor implements NestInterceptor {

intercept(context: ExecutionContext, next: CallHandler): Observable<any> {

console.log('Before...');

const now = Date.now();

return next.handle().pipe(

tap(() => console.log(<code>After... ${Date.now() - now}ms</code>)),

);

}

}

@Controller('cats')

class CatsController {

@UseInterceptors(LoggingInterceptor)

@Get()

findAll(): string {

return 'This action returns all cats';

}

}

在上面的示例中,LoggingInterceptor 是一个自定义的拦截器类,它实现了 NestInterceptor 接口。在 intercept 方法中,可以在请求到达处理程序之前打印日志,并在请求处理完成后再次打印日志。

中间件是一种用于处理请求和响应之间的中间环节的机制。它们可以在请求到达处理程序之前或之后对请求进行修改,也可以在响应发送之前或之后对响应进行修改。中间件提供了一种灵活的方式来处理请求和响应,可以执行一些通用的逻辑,例如身份验证、日志记录、错误处理等。

下面是一个使用中间件的示例代码:

typescript

@Injectable()

class LoggerMiddleware implements NestMiddleware {

use(req: Request, res: Response, next: NextFunction) {

console.log(<code>Request...</code>);

next();

}

}

@Controller('cats')

@UseMiddleware(LoggerMiddleware)

class CatsController {

@Get()

findAll(): string {

return 'This action returns all cats';

}

}

在上面的示例中,LoggerMiddleware 是一个自定义的中间件类,它实现了 NestMiddleware 接口。在 use 方法中,可以在请求到达处理程序之前打印日志。

过滤器是一种用于处理异常情况的机制。它们可以在发生异常时对请求进行处理,并返回自定义的响应。过滤器可以根据不同的异常类型来执行不同的操作,例如返回特定的错误信息、重定向到其他页面等。

下面是一个使用过滤器的示例代码:

typescript

@Catch(HttpException)

class HttpExceptionFilter implements ExceptionFilter {

catch(exception: HttpException, host: ArgumentsHost) {

const ctx = host.switchToHttp();

const response = ctx.getResponse<Response>();

const status = exception.getStatus();

response

.status(status)

.JSon({

statusCode: status,

message: 'Something went wrong',

});

}

}

@Controller('cats')

@UseFilters(HttpExceptionFilter)

class CatsController {

@Get()

findAll(): string {

throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);

}

}

在上面的示例中,HttpExceptionFilter 是一个自定义的过滤器类,它实现了 ExceptionFilter 接口。在 catch 方法中,可以根据异常类型来处理异常,并返回自定义的响应。

拦截器、中间件和过滤器是 Nest.JS 中用于处理请求和响应的不同机制。拦截器用于在请求处理管道中对请求进行处理,中间件用于处理请求和响应之间的中间环节,过滤器用于处理异常情况。它们各自有不同的功能和用法,可以根据实际需求选择合适的机制来处理请求和响应。

以上就是关于 Nest.JS 中拦截器、中间件和过滤器的区别的介绍和示例代码。希望本文能够帮助你更好地理解和应用这些概念。

举报有用(4分享收藏

Wenty0204

2025-09-19 22:26

+ 关注

在Nest.JS中,拦截器、中间件和过滤器都用于处理请求和响应,但它们的作用和使用场景有所不同。拦截器(Interceptor)可以拦截请求和响应,修改它们,甚至在请求到达控制器之前或响应返回给客户端之前执行一些业务逻辑。中间件(Middleware)在请求到达控制器之前执行,用于执行一些通用的操作,如日志记录、身份验证等。过滤器(Exception Filter)用于捕获异常,并返回一个用户友好的响应,可以集中处理异常,而不是在每个控制器中单独处理。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号