NestJS简明教程——异常处理和日志

一、异常处理

1.1 配置

一般使用拦截器(filter)

bash 复制代码
nest g filter db-exception

./db-exception.filter.ts

ts 复制代码
import { DriverException, NotFoundError } from '@mikro-orm/core';
import {
  ArgumentsHost,
  Catch,
  ExceptionFilter,
  HttpStatus,
} from '@nestjs/common';
import { Response } from 'express';

const DB_HTTP_MAP: Record<string, { status: number; message: string }> = {
  NotFoundError: {
    status: HttpStatus.NOT_FOUND,
    message: 'Resource not found',
  },
};

@Catch(NotFoundError)
export class DbExceptionFilter implements ExceptionFilter {
  catch(exception: DriverException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const name = exception.name;

    const mapped = DB_HTTP_MAP[exception.name] ?? {
      status: HttpStatus.INTERNAL_SERVER_ERROR,
      message: 'Database error',
    };

    response.status(mapped.status).json(mapped);
  }
}

2.2 注册

一般使用全局注册

./main.ts

ts 复制代码
import { DbExceptionFilter } from './filter/db-exception/db-exception.filter';
// 加入全局数据库异常过滤器
  app.useGlobalFilters(new DbExceptionFilter());

二、日志

2.1 通过中间件

ts 复制代码
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log("Request ... ");
    next();
  }
}

2.2 通过pino

安装

bash 复制代码
pnpm add pino nestjs-pino pino-http pino-pretty

配置

./main.ts

ts 复制代码
import { Logger } from 'nestjs-pino';
app.useLogger(app.get(Logger));

./app.module.ts

ts 复制代码
import { Module } from '@nestjs/common';
import mikroConfig from '../mikro-orm.config';
import { LoggerModule } from 'nestjs-pino';
@Module({
  imports: [
    LoggerModule.forRoot({
      pinoHttp: {
        transport: {
          targets: [
            {
              target: 'pino-pretty',
              options: {
                colorize: true,
              },
            },
            {
              target: 'pino/file',
              options: {
                destination: './logs/app.log',
                mkdir: true,
              },
            },
          ],
        },
      },
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}
相关推荐
paopaokaka_luck9 小时前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
Highcharts.js9 小时前
图表开发实战总结| 7 条“黄金法则”与“性能铁律”
前端·javascript·vue.js·编辑器·时序数据库·highcharts
Helix2509 小时前
Electron、WebView 框架与 HTA 对比:桌面应用选型、安全性与现代替代方案
前端·javascript·electron·webview·vbscript·hta·本地html应用
Ikalus19889 小时前
三套 API 都告诉我成功了,浏览器一个字都没收到
javascript
Ikalus19889 小时前
计数器停在 0,我差点把一篇空摘要发出去
javascript
付威202310 小时前
Rust 所有权:看你的答对几道题?
javascript
西红柿炖牛腩35410 小时前
Three.js 模型体积优化:Draco/Meshopt 压缩与 DRACOLoader 配置的 4 个步骤
javascript·3d·性能优化
薛一半10 小时前
React-Redux核心原理与容器组件实战
前端·javascript·react.js
web打印社区10 小时前
C-Lodop 提示未准备好或 WebSocket 没准备好:先让本机服务起来
javascript·网络·websocket·网络协议·pdf·html
言乐610 小时前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript