Node.js-API 限流与日志优化

​🌈个人主页:前端青山

🔥系列专栏:node.js篇

🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来node.js篇专栏内容:node.js-API 限流与日志优化

前言

在前几篇文章中,我们已经为 API 添加了身份验证、CORS 配置、缓存机制和性能监控。本文将继续在这个基础上,进一步增强 API 的稳定性和可维护性。我们将添加 API 限流功能,并对日志进行优化,以便更好地跟踪和调试应用。

目录

前言

目录

[1. 添加 API 限流](#1. 添加 API 限流)

[1.1 安装依赖](#1.1 安装依赖)

[1.2 创建限流中间件](#1.2 创建限流中间件)

[1.3 应用限流中间件](#1.3 应用限流中间件)

[2. 优化日志记录](#2. 优化日志记录)

[2.1 安装依赖](#2.1 安装依赖)

[2.2 创建日志配置](#2.2 创建日志配置)

[2.3 更新日志中间件](#2.3 更新日志中间件)

[3. 项目结构](#3. 项目结构)

[4. 运行项目](#4. 运行项目)

[5. 测试与验证](#5. 测试与验证)

[5.1 测试 API 限流](#5.1 测试 API 限流)

[5.2 验证日志记录](#5.2 验证日志记录)

[6. 总结与展望](#6. 总结与展望)

1. 添加 API 限流

为了防止 API 被恶意请求或滥用,我们可以添加 API 限流功能。这有助于保护服务器免受 DDoS 攻击,并确保正常用户的请求能够得到及时响应。我们将使用 express-rate-limit 库来实现这一功能。

1.1 安装依赖

首先,我们需要安装 express-rate-limit 库。打开终端,导航到项目根目录,然后运行以下命令:

bash 复制代码
npm install express-rate-limit
1.2 创建限流中间件

接下来,我们在 middlewares 目录下创建一个名为 rateLimiter.js 的文件,用于定义限流中间件。

javascript 复制代码
const rateLimit = require('express-rate-limit');

const apiLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 分钟
  max: 100, // 每个 IP 允许的最大请求数
  message: 'Too many requests from this IP, please try again later.',
});

module.exports = apiLimiter;

在这个中间件中,我们设置了每个 IP 在 15 分钟内最多只能发送 100 个请求。如果超过这个限制,客户端将收到一条提示消息,告知其请求过多,需要稍后再试。

1.3 应用限流中间件

最后,我们需要在 app.js 文件中应用这个限流中间件。打开 app.js 文件,添加以下代码:

javascript 复制代码
require('dotenv').config();
const express = require('express');
const helmet = require('helmet');
const compression = require('compression');
const cors = require('cors');
const swaggerUi = require('swagger-ui-express');
const swaggerJSDoc = require('swagger-jsdoc');
const itemsRouter = require('./routes/items');
const authRouter = require('./routes/auth');
const errorHandler = require('./middlewares/error-handler');
const connectDB = require('./config/db');
const logger = require('./middlewares/logger');
const statusMonitor = require('express-status-monitor');
const apiLimiter = require('./middlewares/rateLimiter');

const app = express();

// 配置 Helmet
app.use(helmet());

// 配置 CORS
app.use(cors());

// 日志中间件
app.use((req, res, next) => {
  logger.info(`${req.method} ${req.url}`);
  next();
});

app.use(express.json()); // 解析 JSON 请求体

// 压缩响应体
app.use(compression());

// 连接 MongoDB
connectDB();

// 性能监控
app.use(statusMonitor());

// API 限流
app.use(apiLimiter);

// 路由
app.use('/items', itemsRouter);
app.use('/auth', authRouter);

// Swagger 配置
const options = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: 'My API',
      version: '1.0.0',
      description: 'This is a simple API for managing items.',
    },
    servers: [
      {
        url: `http://localhost:${process.env.PORT || 3000}`,
      },
    ],
  },
  apis: ['./routes/*.js'], // 指定包含 API 注解的文件
};

const specs = swaggerJSDoc(options);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs));

// 错误处理中间件
app.use(errorHandler);

module.exports = app;

2. 优化日志记录

为了更好地跟踪和调试应用,我们需要优化日志记录。一个好的日志系统可以帮助我们快速定位问题,了解应用的运行状态。我们将使用 winston 库来实现更详细和灵活的日志记录。

2.1 安装依赖

首先,我们需要安装 winstonwinston-daily-rotate-file 库。打开终端,导航到项目根目录,然后运行以下命令:

bash 复制代码
npm install winston winston-daily-rotate-file
2.2 创建日志配置

接下来,我们在 config 目录下创建一个名为 logger.js 的文件,用于定义日志配置。

javascript 复制代码
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  filename: 'application-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d',
  dirname: 'logs',
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    transport,
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      ),
    }),
  ],
});

module.exports = logger;

在这个配置中,我们设置了日志文件的命名规则、日期模式、归档方式、最大文件大小和保留天数。同时,我们还配置了控制台输出,以便在开发过程中能够实时查看日志信息。

2.3 更新日志中间件

最后,我们需要更新 middlewares/logger.js 文件,使用新的日志配置。

javascript 复制代码
const logger = require('../config/logger');

const logRequest = (req, res, next) => {
  logger.info(`${req.method} ${req.url}`);
  next();
};

module.exports = logRequest;

3. 项目结构

确保项目结构如下:

javascript 复制代码
my-app/
├── node_modules/
├── public/
│   └── index.html
├── routes/
│   ├── items.js
│   └── auth.js
├── models/
│   ├── item.js
│   └── user.js
├── middlewares/
│   ├── error-handler.js
│   ├── logger.js
│   ├── auth.js
│   ├── cache.js
│   └── rateLimiter.js
├── config/
│   ├── db.js
│   ├── redis.js
│   └── logger.js
├── .env
├── app.js
└── index.js

4. 运行项目

确保 MongoDB 和 Redis 服务已启动。在项目根目录下运行以下命令启动应用:

bash 复制代码
npm install node index.js

访问 http://localhost:3000/api-docs 查看 Swagger 文档,访问 http://localhost:3000/status 查看性能监控页面。

5. 测试与验证

5.1 测试 API 限流

为了验证 API 限流功能是否生效,我们可以使用 Postman 或其他 HTTP 客户端工具发送多个请求。假设我们设置的限流规则是每个 IP 每 15 分钟最多 100 个请求,我们可以尝试发送超过 100 个请求,看看是否会被限流。

  1. 打开 Postman,创建一个新的请求,设置请求方法为 GET,URL 为 http://localhost:3000/items
  2. 快速发送多个请求,直到达到 100 个请求。
  3. 继续发送请求,观察响应是否返回 429 Too Many Requests 状态码,并且包含提示消息 Too many requests from this IP, please try again later.
5.2 验证日志记录

为了验证日志记录是否正确,我们可以检查日志文件和控制台输出。

  1. 在项目根目录下,找到 logs 目录,查看是否有生成的日志文件。
  2. 打开其中一个日志文件,检查其中的内容是否包含了请求的方法、URL 和时间戳。
  3. 同时,检查控制台输出,确保日志信息也显示在控制台上。

6. 总结与展望

通过本文,我们为 API 添加了限流功能,并优化了日志记录,进一步增强了 API 的稳定性和可维护性。API 限流功能可以帮助我们防止恶意请求和 DDoS 攻击,确保正常用户的请求能够得到及时响应。优化后的日志记录系统则可以帮助我们更好地跟踪和调试应用,快速定位问题。

在未来的文章中,我们将继续探索更多高级功能和技术,如 API 版本控制、安全性增强、部署和容器化等。希望这些改进对你有所帮助!如果你有任何问题或建议,请随时留言交流。

相关推荐
浪里个浪的10242 分钟前
【C#】第6章:用户界面设计 课后习题
开发语言·c#·用户界面
有点困的拿铁12 分钟前
Java中的享元模式
java·开发语言·享元模式
破浪前行·吴20 分钟前
使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
前端·react.js·three.js
随心............23 分钟前
python设计模式
java·开发语言·设计模式
零炻大礼包33 分钟前
【Node-Red】使用文件或相机拍摄实现图像识别
图像处理·node.js
A_cot38 分钟前
Vue.js:构建现代 Web 应用的强大框架
前端·javascript·vue.js·flutter·html·web·js
Kousi41 分钟前
AlphabetIndexer组件,鸿蒙开发
前端·javascript·harmonyos
q5673152342 分钟前
通过scrapy和Django登录、爬取和持久化数据
java·开发语言·数据库·scrapy·django
我爱鸿蒙开发43 分钟前
ArkTS的进阶语法(函数补充与正则表达式)
前端·harmonyos