Node.js添加API限流與日志優(yōu)化詳解
前言
在前幾篇文章中,我們已經(jīng)為 API 添加了身份驗(yàn)證、CORS 配置、緩存機(jī)制和性能監(jiān)控。本文將繼續(xù)在這個(gè)基礎(chǔ)上,進(jìn)一步增強(qiáng) API 的穩(wěn)定性和可維護(hù)性。我們將添加 API 限流功能,并對(duì)日志進(jìn)行優(yōu)化,以便更好地跟蹤和調(diào)試應(yīng)用。
1. 添加 API 限流
為了防止 API 被惡意請(qǐng)求或?yàn)E用,我們可以添加 API 限流功能。這有助于保護(hù)服務(wù)器免受 DDoS 攻擊,并確保正常用戶的請(qǐng)求能夠得到及時(shí)響應(yīng)。我們將使用 express-rate-limit 庫來實(shí)現(xiàn)這一功能。
1.1 安裝依賴
首先,我們需要安裝 express-rate-limit 庫。打開終端,導(dǎo)航到項(xiàng)目根目錄,然后運(yùn)行以下命令:
npm install express-rate-limit
1.2 創(chuàng)建限流中間件
接下來,我們?cè)?nbsp;middlewares 目錄下創(chuàng)建一個(gè)名為 rateLimiter.js 的文件,用于定義限流中間件。
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分鐘
max: 100, // 每個(gè) IP 允許的最大請(qǐng)求數(shù)
message: 'Too many requests from this IP, please try again later.',
});
module.exports = apiLimiter;在這個(gè)中間件中,我們?cè)O(shè)置了每個(gè) IP 在 15 分鐘內(nèi)最多只能發(fā)送 100 個(gè)請(qǐng)求。如果超過這個(gè)限制,客戶端將收到一條提示消息,告知其請(qǐng)求過多,需要稍后再試。
1.3 應(yīng)用限流中間件
最后,我們需要在 app.js 文件中應(yīng)用這個(gè)限流中間件。打開 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 請(qǐng)求體
// 壓縮響應(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));
// 錯(cuò)誤處理中間件
app.use(errorHandler);
module.exports = app;2. 優(yōu)化日志記錄
為了更好地跟蹤和調(diào)試應(yīng)用,我們需要優(yōu)化日志記錄。一個(gè)好的日志系統(tǒng)可以幫助我們快速定位問題,了解應(yīng)用的運(yùn)行狀態(tài)。我們將使用 winston 庫來實(shí)現(xiàn)更詳細(xì)和靈活的日志記錄。
2.1 安裝依賴
首先,我們需要安裝 winston 和 winston-daily-rotate-file 庫。打開終端,導(dǎo)航到項(xiàng)目根目錄,然后運(yùn)行以下命令:
npm install winston winston-daily-rotate-file
2.2 創(chuàng)建日志配置
接下來,我們?cè)?nbsp;config 目錄下創(chuàng)建一個(gè)名為 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;在這個(gè)配置中,我們?cè)O(shè)置了日志文件的命名規(guī)則、日期模式、歸檔方式、最大文件大小和保留天數(shù)。同時(shí),我們還配置了控制臺(tái)輸出,以便在開發(fā)過程中能夠?qū)崟r(shí)查看日志信息。
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. 項(xiàng)目結(jié)構(gòu)
確保項(xiàng)目結(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. 運(yùn)行項(xiàng)目
確保 MongoDB 和 Redis 服務(wù)已啟動(dòng)。在項(xiàng)目根目錄下運(yùn)行以下命令啟動(dòng)應(yīng)用:
npm install node index.js
訪問 http://localhost:3000/api-docs 查看 Swagger 文檔,訪問 http://localhost:3000/status 查看性能監(jiān)控頁面。
5. 測(cè)試與驗(yàn)證
5.1 測(cè)試 API 限流
為了驗(yàn)證 API 限流功能是否生效,我們可以使用 Postman 或其他 HTTP 客戶端工具發(fā)送多個(gè)請(qǐng)求。假設(shè)我們?cè)O(shè)置的限流規(guī)則是每個(gè) IP 每 15 分鐘最多 100 個(gè)請(qǐng)求,我們可以嘗試發(fā)送超過 100 個(gè)請(qǐng)求,看看是否會(huì)被限流。
- 打開 Postman,創(chuàng)建一個(gè)新的請(qǐng)求,設(shè)置請(qǐng)求方法為
GET,URL 為http://localhost:3000/items。 - 快速發(fā)送多個(gè)請(qǐng)求,直到達(dá)到 100 個(gè)請(qǐng)求。
- 繼續(xù)發(fā)送請(qǐng)求,觀察響應(yīng)是否返回
429 Too Many Requests狀態(tài)碼,并且包含提示消息Too many requests from this IP, please try again later.。
5.2 驗(yàn)證日志記錄
為了驗(yàn)證日志記錄是否正確,我們可以檢查日志文件和控制臺(tái)輸出。
- 在項(xiàng)目根目錄下,找到
logs目錄,查看是否有生成的日志文件。 - 打開其中一個(gè)日志文件,檢查其中的內(nèi)容是否包含了請(qǐng)求的方法、URL 和時(shí)間戳。
- 同時(shí),檢查控制臺(tái)輸出,確保日志信息也顯示在控制臺(tái)上。
6. 總結(jié)與展望
通過本文,我們?yōu)?API 添加了限流功能,并優(yōu)化了日志記錄,進(jìn)一步增強(qiáng)了 API 的穩(wěn)定性和可維護(hù)性。API 限流功能可以幫助我們防止惡意請(qǐng)求和 DDoS 攻擊,確保正常用戶的請(qǐng)求能夠得到及時(shí)響應(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一個(gè)簡(jiǎn)單的node.js界面實(shí)現(xiàn)方法
今天小編就為大家分享一篇一個(gè)簡(jiǎn)單的node.js界面實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
如何利用node實(shí)現(xiàn)發(fā)送QQ郵箱驗(yàn)證碼
我們?cè)陂_發(fā)網(wǎng)站時(shí),發(fā)送驗(yàn)證碼的功能是必定會(huì)遇到的,下面這篇文章主要給大家介紹了關(guān)于如何利用node實(shí)現(xiàn)發(fā)送QQ郵箱驗(yàn)證碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
koa+jwt實(shí)現(xiàn)token驗(yàn)證與刷新功能
這篇文章主要介紹了koa+jwt實(shí)現(xiàn)token驗(yàn)證與刷新功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
使用node搭建自動(dòng)發(fā)圖文微博機(jī)器人的方法
這篇文章主要介紹了使用node搭建自動(dòng)發(fā)圖文微博機(jī)器人的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
nodejs對(duì)express中next函數(shù)的一些理解
這篇文章主要介紹了nodejs對(duì)express中next函數(shù)的一些理解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
通過實(shí)例了解Nodejs模塊系統(tǒng)及require機(jī)制
這篇文章主要介紹了通過實(shí)例了解Nodejs模塊系統(tǒng)及require機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
nodejs操作mongodb的填刪改查模塊的制作及引入實(shí)例
下面小編就為大家分享一篇nodejs操作mongodb的填刪改查模塊的制作及引入實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01

