Node.js添加API限流与日志优化详解
作者:前端青山
前言
在前几篇文章中,我们已经为 API 添加了身份验证、CORS 配置、缓存机制和性能监控。本文将继续在这个基础上,进一步增强 API 的稳定性和可维护性。我们将添加 API 限流功能,并对日志进行优化,以便更好地跟踪和调试应用。
1. 添加 API 限流
为了防止 API 被恶意请求或滥用,我们可以添加 API 限流功能。这有助于保护服务器免受 DDoS 攻击,并确保正常用户的请求能够得到及时响应。我们将使用 express-rate-limit
库来实现这一功能。
1.1 安装依赖
首先,我们需要安装 express-rate-limit
库。打开终端,导航到项目根目录,然后运行以下命令:
npm install express-rate-limit
1.2 创建限流中间件
接下来,我们在 middlewares
目录下创建一个名为 rateLimiter.js
的文件,用于定义限流中间件。
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
文件,添加以下代码:
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 安装依赖
首先,我们需要安装 winston
和 winston-daily-rotate-file
库。打开终端,导航到项目根目录,然后运行以下命令:
npm install winston winston-daily-rotate-file
2.2 创建日志配置
接下来,我们在 config
目录下创建一个名为 logger.js
的文件,用于定义日志配置。
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
文件,使用新的日志配置。
const logger = require('../config/logger'); const logRequest = (req, res, next) => { logger.info(`${req.method} ${req.url}`); next(); }; module.exports = logRequest;
3. 项目结构
确保项目结构如下:
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 服务已启动。在项目根目录下运行以下命令启动应用:
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 个请求,看看是否会被限流。
- 打开 Postman,创建一个新的请求,设置请求方法为
GET
,URL 为http://localhost:3000/items
。 - 快速发送多个请求,直到达到 100 个请求。
- 继续发送请求,观察响应是否返回
429 Too Many Requests
状态码,并且包含提示消息Too many requests from this IP, please try again later.
。
5.2 验证日志记录
为了验证日志记录是否正确,我们可以检查日志文件和控制台输出。
- 在项目根目录下,找到
logs
目录,查看是否有生成的日志文件。 - 打开其中一个日志文件,检查其中的内容是否包含了请求的方法、URL 和时间戳。
- 同时,检查控制台输出,确保日志信息也显示在控制台上。
6. 总结与展望
通过本文,我们为 API 添加了限流功能,并优化了日志记录,进一步增强了 API 的稳定性和可维护性。API 限流功能可以帮助我们防止恶意请求和 DDoS 攻击,确保正常用户的请求能够得到及时响应。优化后的日志记录系统则可以帮助我们更好地跟踪和调试应用,快速定位问题。
到此这篇关于Node.js添加API限流与日志优化的文章就介绍到这了,更多相关Node.js API限流与日志优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!