NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它基于 Express.js,并且结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。NestJS 提供了一套丰富的功能,包括模块化、依赖注入、装饰器等,使得开发者能够更快速地构建复杂的应用程序。
在 NestJS 中,错误筛选器是一种特殊的过滤器,用于捕获和处理应用程序中抛出的异常。错误筛选器可以全局应用,也可以应用于特定的控制器或路由。通过使用错误筛选器,开发者可以自定义异常的处理方式,例如返回自定义的错误响应、记录日志等。
在错误筛选器中进行异步操作是可行的,但需要注意一些细节。错误筛选器通常会接收一个 ArgumentsHost
对象,该对象包含了请求和响应的上下文。通过这个对象,可以访问请求和响应的相关信息。
以下是一个简单的错误筛选器示例,展示了如何在错误筛选器中进行异步操作:
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception instanceof HttpException ? exception.getStatus() : 500;
// 异步操作示例:记录日志
this.logError(exception, request);
response.status(status).json({
statusCode: status,
message: 'Internal server error',
path: request.url,
});
}
private async logError(exception: unknown, request: Request) {
// 模拟异步日志记录
await new Promise(resolve => setTimeout(resolve, 1000));
console.error(`[${new Date().toISOString()}] ${request.method} ${request.url} - ${exception}`);
}
}
main.ts
)中注册全局错误筛选器,统一处理所有未捕获的异常。如果在错误筛选器中进行异步操作(如日志记录),但未等待异步操作完成就返回了响应,可能会导致日志记录不完整。
解决方法:确保在返回响应之前等待异步操作完成。可以使用 await
关键字来等待 Promise 的解决。
private async logError(exception: unknown, request: Request) {
await new Promise(resolve => setTimeout(resolve, 1000));
console.error(`[${new Date().toISOString()}] ${request.method} ${request.url} - ${exception}`);
}
如果在异步操作中抛出了新的异常,可能会导致原始异常信息丢失。
解决方法:在异步操作中使用 try-catch
块捕获异常,并进行适当的处理。
private async logError(exception: unknown, request: Request) {
try {
await new Promise((resolve, reject) => setTimeout(() => reject(new Error('Logging failed')), 1000));
} catch (logException) {
console.error(`[${new Date().toISOString()}] Logging failed for ${request.url} - ${logException}`);
}
console.error(`[${new Date().toISOString()}] ${request.method} ${request.url} - ${exception}`);
}
通过以上方法,可以有效地在 NestJS 的错误筛选器中进行异步操作,并处理可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云