Node.js添加API限流与日志优化详解

 更新时间:2024年11月11日 09:08:32   作者:前端青山  
这篇文章主要介绍了Node.js添加API限流与日志优化的相关资料,以增强API的稳定性和可维护性,API限流功能可以防止恶意请求和DDoS攻击,优化后的日志记录系统则可以帮助我们更好地跟踪和调试应用,快速定位问题,需要的朋友可以参考下

前言

在前几篇文章中,我们已经为 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限流与日志优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一个简单的node.js界面实现方法

    一个简单的node.js界面实现方法

    今天小编就为大家分享一篇一个简单的node.js界面实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 如何利用node实现发送QQ邮箱验证码

    如何利用node实现发送QQ邮箱验证码

    我们在开发网站时,发送验证码的功能是必定会遇到的,下面这篇文章主要给大家介绍了关于如何利用node实现发送QQ邮箱验证码的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • koa+jwt实现token验证与刷新功能

    koa+jwt实现token验证与刷新功能

    这篇文章主要介绍了koa+jwt实现token验证与刷新功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 使用node搭建自动发图文微博机器人的方法

    使用node搭建自动发图文微博机器人的方法

    这篇文章主要介绍了使用node搭建自动发图文微博机器人的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • nodejs对express中next函数的一些理解

    nodejs对express中next函数的一些理解

    这篇文章主要介绍了nodejs对express中next函数的一些理解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Node.js的中间件及使用方法详解

    Node.js的中间件及使用方法详解

    在Node.js的生态中,中间件(Middleware)是一个不可或缺的概念,它为构建灵活而高效的应用程序提供了强大的支持,下面给大家介绍Node.js的中间件及使用方法,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • NodeJS模块Buffer原理及使用方法解析

    NodeJS模块Buffer原理及使用方法解析

    这篇文章主要介绍了NodeJS模块Buffer原理及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 通过实例了解Nodejs模块系统及require机制

    通过实例了解Nodejs模块系统及require机制

    这篇文章主要介绍了通过实例了解Nodejs模块系统及require机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • nodejs操作mongodb的填删改查模块的制作及引入实例

    nodejs操作mongodb的填删改查模块的制作及引入实例

    下面小编就为大家分享一篇nodejs操作mongodb的填删改查模块的制作及引入实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 详解autojs的nodejs编写UI技巧示例

    详解autojs的nodejs编写UI技巧示例

    这篇文章主要为大家介绍了autojs的nodejs编写UI技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论