mirror of
https://github.com/Chanzhaoyu/chatgpt-web.git
synced 2025-07-21 03:44:21 +00:00
feat: 新增限流功能 (#718)
* 请求速率限制 * perf: 优化代码 --------- Co-authored-by: ChenZhaoYu <790348264@qq.com>
This commit is contained in:
@@ -27,3 +27,6 @@ SOCKS_PROXY_PORT=
|
||||
|
||||
# HTTPS PROXY
|
||||
HTTPS_PROXY=
|
||||
|
||||
# Rate Limit
|
||||
MAX_REQUEST_PER_HOUR=
|
||||
|
@@ -29,6 +29,7 @@
|
||||
"dotenv": "^16.0.3",
|
||||
"esno": "^0.16.3",
|
||||
"express": "^4.18.2",
|
||||
"express-rate-limit": "^6.7.0",
|
||||
"https-proxy-agent": "^5.0.1",
|
||||
"isomorphic-fetch": "^3.0.0",
|
||||
"node-fetch": "^3.3.0",
|
||||
|
11
service/pnpm-lock.yaml
generated
11
service/pnpm-lock.yaml
generated
@@ -10,6 +10,7 @@ specifiers:
|
||||
eslint: ^8.35.0
|
||||
esno: ^0.16.3
|
||||
express: ^4.18.2
|
||||
express-rate-limit: ^6.7.0
|
||||
https-proxy-agent: ^5.0.1
|
||||
isomorphic-fetch: ^3.0.0
|
||||
node-fetch: ^3.3.0
|
||||
@@ -24,6 +25,7 @@ dependencies:
|
||||
dotenv: 16.0.3
|
||||
esno: 0.16.3
|
||||
express: 4.18.2
|
||||
express-rate-limit: 6.7.0_express@4.18.2
|
||||
https-proxy-agent: 5.0.1
|
||||
isomorphic-fetch: 3.0.0
|
||||
node-fetch: 3.3.0
|
||||
@@ -1740,6 +1742,15 @@ packages:
|
||||
strip-final-newline: 2.0.0
|
||||
dev: true
|
||||
|
||||
/express-rate-limit/6.7.0_express@4.18.2:
|
||||
resolution: {integrity: sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==}
|
||||
engines: {node: '>= 12.9.0'}
|
||||
peerDependencies:
|
||||
express: ^4 || ^5
|
||||
dependencies:
|
||||
express: 4.18.2
|
||||
dev: false
|
||||
|
||||
/express/4.18.2:
|
||||
resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
|
||||
engines: {node: '>= 0.10.0'}
|
||||
|
@@ -2,6 +2,7 @@ import express from 'express'
|
||||
import type { ChatContext, ChatMessage } from './chatgpt'
|
||||
import { chatConfig, chatReplyProcess, currentModel } from './chatgpt'
|
||||
import { auth } from './middleware/auth'
|
||||
import { limiter } from './middleware/limiter'
|
||||
import { isNotEmptyString } from './utils/is'
|
||||
|
||||
const app = express()
|
||||
@@ -17,7 +18,7 @@ app.all('*', (_, res, next) => {
|
||||
next()
|
||||
})
|
||||
|
||||
router.post('/chat-process', auth, async (req, res) => {
|
||||
router.post('/chat-process', [auth, limiter], async (req, res) => {
|
||||
res.setHeader('Content-type', 'application/octet-stream')
|
||||
|
||||
try {
|
||||
|
19
service/src/middleware/limiter.ts
Normal file
19
service/src/middleware/limiter.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { rateLimit } from 'express-rate-limit'
|
||||
import { isNotEmptyString } from '../utils/is'
|
||||
|
||||
const MAX_REQUEST_PER_HOUR = process.env.MAX_REQUEST_PER_HOUR
|
||||
|
||||
const maxCount = (isNotEmptyString(MAX_REQUEST_PER_HOUR) && !isNaN(Number(MAX_REQUEST_PER_HOUR)))
|
||||
? parseInt(MAX_REQUEST_PER_HOUR)
|
||||
: 0 // 0 means unlimited
|
||||
|
||||
const limiter = rateLimit({
|
||||
windowMs: 60 * 60 * 1000, // Maximum number of accesses within an hour
|
||||
max: maxCount,
|
||||
statusCode: 200, // 200 means success,but the message is 'Too many request from this IP in 1 hour'
|
||||
message: async (req, res) => {
|
||||
res.send({ status: 'Fail', message: 'Too many request from this IP in 1 hour', data: null })
|
||||
},
|
||||
})
|
||||
|
||||
export { limiter }
|
Reference in New Issue
Block a user