nest 拦截器

nest 拦截器

全局响应拦截器

ts
import { ArgumentsHost, Catch, ExceptionFilter, HttpStatus, ServiceUnavailableException } from '@nestjs/common'
import { FastifyReply, FastifyRequest } from 'fastify'

@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
    catch(exception: Error, host: ArgumentsHost) {
        const ctx = host.switchToHttp()
        const response = ctx.getResponse<FastifyReply>()
        const request = ctx.getRequest<FastifyRequest>()

        request.log.error(exception)

        // 非 HTTP 标准异常处理
        response.status(HttpStatus.SERVICE_UNAVAILABLE).send({
            statusCode: HttpStatus.SERVICE_UNAVAILABLE,
            timestamp: new Date().toISOString(),
            path: request.url,
            message: new ServiceUnavailableException().getResponse(),
        })
    }
}

全局 HTTP 响应拦截器

ts
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus } from '@nestjs/common'
import { FastifyReply, FastifyRequest } from 'fastify'

import { BusinessExceptions } from './business.exception.filter'

@Catch(HttpException)
export class HttpExceptionsFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        const ctx = host.switchToHttp()
        const response = ctx.getResponse<FastifyReply>()
        const request = ctx.getRequest<FastifyRequest>()
        const status = exception.getStatus()

        if (exception instanceof BusinessExceptions) {
            const error = exception.getResponse()
            response.status(HttpStatus.OK).send({
                data: null,
                status: error.code,
                extra: {},
                message: error.message,
                success: false,
            })
            return
        }
        response.status(status).send({
            statusCode: status,
            timestamp: new Date().toISOString(),
            path: request.url,
            message: exception.getResponse(),
        })
    }
}

自定义拦截器

ts
import { HttpException, HttpStatus } from '@nestjs/common'

import { BUSINESS_ERROR_CODE } from './business.error.codes'

interface BusinessError {
    code: number
    message: string
}

export class BusinessExceptions extends HttpException {
    constructor(err: BusinessError | string) {
        if (typeof err === 'string') {
            err = {
                code: BUSINESS_ERROR_CODE.COMMON,
                message: err,
            }
        }
        super(err, HttpStatus.OK)
    }

    static throwForbidden() {
        throw new BusinessExceptions({
            code: BUSINESS_ERROR_CODE.ACCESS_FORBIDDEN,
            message: '抱歉哦,您无此权限!',
        })
    }
}
nest 服务提供者
MIME类型和blob