Node.js添加API限流與日志優(yōu)化詳解
前言
在前幾篇文章中,我們已經(jīng)為 API 添加了身份驗證、CORS 配置、緩存機制和性能監(jiān)控。本文將繼續(xù)在這個基礎(chǔ)上,進一步增強 API 的穩(wěn)定性和可維護性。我們將添加 API 限流功能,并對日志進行優(yōu)化,以便更好地跟蹤和調(diào)試應(yīng)用。
1. 添加 API 限流
為了防止 API 被惡意請求或濫用,我們可以添加 API 限流功能。這有助于保護服務(wù)器免受 DDoS 攻擊,并確保正常用戶的請求能夠得到及時響應(yīng)。我們將使用 express-rate-limit
庫來實現(xiàn)這一功能。
1.1 安裝依賴
首先,我們需要安裝 express-rate-limit
庫。打開終端,導(dǎo)航到項目根目錄,然后運行以下命令:
npm install express-rate-limit
1.2 創(chuàng)建限流中間件
接下來,我們在 middlewares
目錄下創(chuàng)建一個名為 rateLimiter.js
的文件,用于定義限流中間件。
const rateLimit = require('express-rate-limit'); const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 分鐘 max: 100, // 每個 IP 允許的最大請求數(shù) message: 'Too many requests from this IP, please try again later.', }); module.exports = apiLimiter;
在這個中間件中,我們設(shè)置了每個 IP 在 15 分鐘內(nèi)最多只能發(fā)送 100 個請求。如果超過這個限制,客戶端將收到一條提示消息,告知其請求過多,需要稍后再試。
1.3 應(yīng)用限流中間件
最后,我們需要在 app.js
文件中應(yīng)用這個限流中間件。打開 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 請求體 // 壓縮響應(yīng)體 app.use(compression()); // 連接 MongoDB connectDB(); // 性能監(jiān)控 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. 優(yōu)化日志記錄
為了更好地跟蹤和調(diào)試應(yīng)用,我們需要優(yōu)化日志記錄。一個好的日志系統(tǒng)可以幫助我們快速定位問題,了解應(yīng)用的運行狀態(tài)。我們將使用 winston
庫來實現(xiàn)更詳細和靈活的日志記錄。
2.1 安裝依賴
首先,我們需要安裝 winston
和 winston-daily-rotate-file
庫。打開終端,導(dǎo)航到項目根目錄,然后運行以下命令:
npm install winston winston-daily-rotate-file
2.2 創(chuàng)建日志配置
接下來,我們在 config
目錄下創(chuàng)建一個名為 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;
在這個配置中,我們設(shè)置了日志文件的命名規(guī)則、日期模式、歸檔方式、最大文件大小和保留天數(shù)。同時,我們還配置了控制臺輸出,以便在開發(fā)過程中能夠?qū)崟r查看日志信息。
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. 項目結(jié)構(gòu)
確保項目結(jié)構(gòu)如下:
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 服務(wù)已啟動。在項目根目錄下運行以下命令啟動應(yīng)用:
npm install node index.js
訪問 http://localhost:3000/api-docs
查看 Swagger 文檔,訪問 http://localhost:3000/status
查看性能監(jiān)控頁面。
5. 測試與驗證
5.1 測試 API 限流
為了驗證 API 限流功能是否生效,我們可以使用 Postman 或其他 HTTP 客戶端工具發(fā)送多個請求。假設(shè)我們設(shè)置的限流規(guī)則是每個 IP 每 15 分鐘最多 100 個請求,我們可以嘗試發(fā)送超過 100 個請求,看看是否會被限流。
- 打開 Postman,創(chuàng)建一個新的請求,設(shè)置請求方法為
GET
,URL 為http://localhost:3000/items
。 - 快速發(fā)送多個請求,直到達到 100 個請求。
- 繼續(xù)發(fā)送請求,觀察響應(yīng)是否返回
429 Too Many Requests
狀態(tài)碼,并且包含提示消息Too many requests from this IP, please try again later.
。
5.2 驗證日志記錄
為了驗證日志記錄是否正確,我們可以檢查日志文件和控制臺輸出。
- 在項目根目錄下,找到
logs
目錄,查看是否有生成的日志文件。 - 打開其中一個日志文件,檢查其中的內(nèi)容是否包含了請求的方法、URL 和時間戳。
- 同時,檢查控制臺輸出,確保日志信息也顯示在控制臺上。
6. 總結(jié)與展望
通過本文,我們?yōu)?API 添加了限流功能,并優(yōu)化了日志記錄,進一步增強了 API 的穩(wěn)定性和可維護性。API 限流功能可以幫助我們防止惡意請求和 DDoS 攻擊,確保正常用戶的請求能夠得到及時響應(yīng)。優(yōu)化后的日志記錄系統(tǒng)則可以幫助我們更好地跟蹤和調(diào)試應(yīng)用,快速定位問題。
到此這篇關(guān)于Node.js添加API限流與日志優(yōu)化的文章就介紹到這了,更多相關(guān)Node.js API限流與日志優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于NodeJs和JAVA建立socket連接方式
這篇文章主要介紹了關(guān)于NodeJs和JAVA建立socket連接方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
這篇文章主要介紹了詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11nodejs將JSON字符串轉(zhuǎn)化為JSON對象報錯的解決
這篇文章主要介紹了nodejs將JSON字符串轉(zhuǎn)化為JSON對象報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07使用nodejs實現(xiàn)JSON文件自動轉(zhuǎn)Excel的工具(推薦)
這篇文章主要介紹了使用nodejs實現(xiàn),JSON文件自動轉(zhuǎn)Excel的工具,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06node.js中的buffer.Buffer.isBuffer方法使用說明
這篇文章主要介紹了node.js中的buffer.Buffer.isBuffer方法使用說明,本文介紹了buffer.Buffer.isBuffer的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12