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

作者:编程家 分类: 编程代码 时间:2025-07-20

Nest.js是一个基于Node.js的开发框架,它提供了一种简单而强大的方式来构建高效可扩展的Web应用程序。在Nest.js中,拦截器、中间件和过滤器是三个非常重要的概念,它们在请求和响应的处理过程中起到了不同的作用。本文将深入探讨这三者的区别,并通过示例代码来说明它们的使用方法。

拦截器

拦截器是Nest.js中用于拦截请求和响应过程的一种机制。它可以在请求到达控制器之前或响应返回给客户端之前对数据进行处理。拦截器可以用来实现一些通用的功能,例如日志记录、身份验证、数据转换等。拦截器可以被应用于整个应用程序、控制器或具体的路由处理程序。

在Nest.js中,拦截器需要实现`NestInterceptor`接口,并重写`intercept`方法来定义拦截逻辑。下面是一个简单的示例代码,展示了一个用于记录请求日志的拦截器:

typescript

@Injectable()

export class LoggerInterceptor implements NestInterceptor {

intercept(context: ExecutionContext, next: CallHandler): Observable {

console.log('Request received...');

const now = Date.now();

return next.handle().pipe(

tap(() => console.log(`Response sent in ${Date.now() - now}ms`)),

);

}

}

在上述示例中,`LoggerInterceptor`实现了`NestInterceptor`接口,并重写了`intercept`方法。在`intercept`方法中,我们可以在请求到达控制器之前打印日志,并在响应返回给客户端之前再次打印日志。

中间件

中间件是Nest.js中另一个重要的概念,它可以在请求和响应之间执行一些预处理逻辑。中间件可以用于处理跨域请求、请求体解析、异常处理等场景。与拦截器不同,中间件是基于函数的,可以通过函数方式进行定义和使用。

在Nest.js中,中间件可以通过使用`@Middleware()`装饰器来定义,并可以通过在路由处理程序、控制器或应用级别上使用`@UseMiddleware()`装饰器来应用。下面是一个简单的示例代码,展示了一个用于处理跨域请求的中间件:

typescript

@Injectable()

export class CorsMiddleware implements NestMiddleware {

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

res.setHeader('Access-Control-Allow-Origin', '*');

res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');

res.setHeader('Access-Control-Allow-Headers', 'Content-Type');

next();

}

}

在上述示例中,`CorsMiddleware`定义了一个`use`方法,用于设置响应头信息以实现跨域请求。然后,我们可以通过在路由处理程序或控制器上使用`@UseMiddleware(CorsMiddleware)`来应用该中间件。

过滤器

过滤器是Nest.js中用于处理异常情况的一种机制。当应用程序抛出异常时,过滤器可以捕获并处理这些异常,然后返回一个自定义的响应给客户端。过滤器可以用于实现全局异常处理、自定义错误消息等功能。

在Nest.js中,过滤器需要实现`ExceptionFilter`接口,并可以通过使用`@Catch()`装饰器来指定要捕获的异常类型。下面是一个简单的示例代码,展示了一个用于处理自定义异常的过滤器:

typescript

@Catch(CustomException)

export class CustomExceptionFilter implements ExceptionFilter {

catch(exception: CustomException, host: ArgumentsHost) {

const ctx = host.switchToHttp();

const response = ctx.getResponse();

const status = HttpStatus.BAD_REQUEST;

response.status(status).json({

statusCode: status,

message: exception.message,

});

}

}

在上述示例中,`CustomExceptionFilter`实现了`ExceptionFilter`接口,并通过`@Catch(CustomException)`装饰器指定了要捕获的异常类型为`CustomException`。在`catch`方法中,我们可以获取到响应对象,并根据异常类型设置自定义的错误消息。

在Nest.js中,拦截器、中间件和过滤器是三个重要的概念,它们在请求和响应的处理过程中起到了不同的作用。拦截器用于拦截请求和响应过程,可以在请求到达控制器之前或响应返回给客户端之前对数据进行处理。中间件用于在请求和响应之间执行一些预处理逻辑,例如处理跨域请求、请求体解析等。过滤器用于处理异常情况,可以捕获并处理应用程序抛出的异常。

通过使用拦截器、中间件和过滤器,我们可以在Nest.js应用程序中实现一些通用的功能,提高开发效率并提供更好的用户体验。

以上就是对Nest.js中拦截器、中间件和过滤器的区别的详细解释和示例代码。希望本文能帮助你更好地理解和使用这三个概念。