【NestJS】跨域、全局异常处理、限速

本文介绍了如何在NestJS中实现跨域配置,包括从环境变量读取允许的源,并设置凭证和HTTP方法。同时,展示了两种全局异常过滤器的实现,分别针对HttpException和所有异常类型,用于捕获错误并返回结构化的错误响应。最后,文章讲解了使用express-rate-limit库来限制API的访问频率,保护应用免受暴力攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跨域

  const app = await NestFactory.create(AppModule)

  const origins = JSON.parse(process.env.LSC_CORS_ORIGIN)
  //["http://localhost:8080","http://localhost:8081"]

  app.enableCors({

    "origin": origins,
    // "origin": "*",

    "credentials": true,

    // "allowedHeaders":['Authorization','content-type'],
    
    "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",

    "preflightContinue": false,

    "optionsSuccessStatus": 204

  })//https://github.com/expressjs/cors#configuration-options

全局异常处理

可以捕获全局异常并且进行日志等相关记录

//HttpException 类型

import { ExceptionFilter, Catch, ArgumentsHost, HttpException,HttpStatus } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();
		// @TODO 记录日志
    console.log('全局 HttpException 异常日志: %s %s error: %s', request.method, request.url, exception.message);
    // 发送响应
    response
      .status(status)
      .json({
        statusCode: status,
      	message: exception.message,
        timestamp: new Date().getTime(),
        path: request.url,
      });
  }
}
//不分异常类型


import {
    ExceptionFilter,
    Catch,
    ArgumentsHost,
    HttpException,
    HttpStatus,
} from '@nestjs/common'

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

        const status =
            exception instanceof HttpException
                ? exception.getStatus()
                : HttpStatus.INTERNAL_SERVER_ERROR

        const exceptionStr = exception ? `message:${exception['message']},stack:${exception['stack']}` : ''

        console.log('全局异常日志: %s %s %s error: %s', request.method, request.url, request.body, exceptionStr)

        response.status(status).json({
            statusCode: status,
            timestamp: new Date().getTime(),
            message: exception['message'],
            method: request.method,
            path: request.url,
        })
    }
}
//设置为全局异常

app.useGlobalFilters(new HttpExceptionFilter(),new AllExceptionsFilter())

//https://docs.nestjs.cn/7/exceptionfilters

限速

保护node程序免受暴力攻击

$ npm i --save express-rate-limit


  app.use(
    rateLimit({
      windowMs: 15 * 60 * 1000, // 15分钟
      max: 1000, // 限制15分钟内最多只能访问1000次
    }),
  )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员查理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值