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 {}
相关推荐
你别说话了13 小时前
Vue项目解决跨域
前端·javascript·vue.js
指尖时光.13 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
唐青枫13 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
学习星球16 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
YuJie18 小时前
JSBridge 基础知识
前端·javascript
默_笙18 小时前
🍕 后端接口还没写好,前端已经跑起来了?Mock 数据 + axios 接口层,前后端再也不互相"等"
前端·javascript
爱勇宝18 小时前
客户只想看个页面,我却做了一个静态演示发布系统
前端·javascript·后端
界面开发小八哥21 小时前
界面控件DevExpress Blazor v26.1新版亮点 - Navigation(导航)
javascript·.net·界面控件·blazor·devexpress·ui开发
SendTomo1 天前
send.wang(私传网)基于网页P2P直连传输大文件的优势
javascript·网络·webrtc·html5·p2p
学习星球1 天前
Astro 全栈实战:拆解 RealWorld 项目
前端·javascript·架构·系统架构·前端框架·c5全栈