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 {}
相关推荐
海带紫菜菠萝汤5 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
名字还没想好☜5 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
upgrador5 小时前
桌面应用开发:Electron 与 NSIS 的关系、打包流程及 Windows 本地构建实战
javascript·windows·electron
Revolution615 小时前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
Revolution615 小时前
Nest.js 是什么:怎样用它写出第一个后端接口
后端·node.js·nestjs
我要两颗404西柚5 小时前
Stage three:VUE工程化与实战工具
前端·javascript·vue.js
写不来代码的草莓熊6 小时前
Cesium 地图交互绘制圆形、多边形
前端·javascript·地图
JackSparrow4147 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
柳林林8 小时前
解决 nvm 切换 Node.js 版本时报“没有文件扩展 ‘.vbs’ 的脚本引擎”错误
node.js