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 分钟前
Vue3 零基础每日笔记(017):事件处理进阶——$event、多事件与事件修饰符全家桶
javascript·vue.js·笔记
光影少年26 分钟前
react navite浏览器 Event Loop 和 Node Event Loop 的区别
前端·javascript·react native·react.js·前端框架
FungLeo9 小时前
成为全栈·Node 后端篇·阅读量防刷:去重、冷却与计数写分离
node.js·读写分离·数据去重·接口防刷·成为全栈·数据冷却
bug总结13 小时前
uniapp vue3全局方法注册使用
前端·javascript·uni-app
华无丽言14 小时前
如何在宜搭中实现获取子表中的字段值赋值到父表中?
前端·javascript·低代码
2601_9623824315 小时前
剑指大前端全栈工程师(全2册)主要情节
javascript·实战案例·全栈工程师·剑指大前端·html5+css3
泯泷15 小时前
手搓JSVM第 12 篇:完整最小 JSVM 实现与源码设计复盘
前端·javascript·前端框架
默_笙15 小时前
🍔 给 AI 发一张结构化表格(下):从"自由发挥"到"按格填空"的输出驯服指南
前端·javascript
泯泷15 小时前
手搓JSVM第 11 篇:打包、模块与 CLI:把 VM 产物变成可运行文件
前端·javascript·前端框架
泯泷15 小时前
手搓JSVM第 10 篇:对象、数组与属性访问
前端·javascript·前端框架