我所面对的问题如下:
案例1(工作案例) :
文件middleware.ts (中间件函数库)
import { NextApiRequest, NextApiResponse } from 'next'
import rateLimit from 'express-rate-limit'
export function runMiddleware(req: NextApiRequest, res: NextApiResponse, fn: Function) {
return new Promise((resolve, reject) => {
fn(req, res, (result: any) => {
if (result instanceof Error) {
return reject(result)
}
return resolve(result)
})
})
}
export const limiter = rateLimit({
keyGenerator: function (req: any) {
return req.headers["x-forwarded-for"] || req.connection.remoteAddress;
}, // Needed because of issue : https://issueexplorer.com/issue/nfriedly/express-rate-limit/254
windowMs: 60 * 1000, // 1 minute
max: 5, // 5 requests per IP
})文件login.ts (我的API入口点)
import { NextApiRequest, NextApiResponse } from 'next'
import { limiter, runMiddleware } from '../../lib/middleware'
module.exports = async (req: NextApiRequest, res: NextApiResponse) => {
// Run middlewares
try {
await runMiddleware(req, res, limiter)
} catch {
res.status(500)
res.end(JSON.stringify({errorCode: 'unknown', errorValue: ''}))
return
}
if (req.method === 'POST') {
res.status(200)
res.end(JSON.stringify({errorCode: 'ok', errorValue: ''}))
}
}在这种情况下,如果我尝试超过5次达到我的API,我会得到消息“太多的请求.”这就是我想要的。
案例2(非工作案例) :
文件middleware.ts (中间件函数库)
import { NextApiRequest, NextApiResponse } from 'next'
export function runMiddleware(req: NextApiRequest, res: NextApiResponse, fn: Function) {
return new Promise((resolve, reject) => {
fn(req, res, (result: any) => {
if (result instanceof Error) {
return reject(result)
}
return resolve(result)
})
})
}文件login.ts (我的API入口点)
import { NextApiRequest, NextApiResponse } from 'next'
import rateLimit from 'express-rate-limit'
import { runMiddleware } from '../../lib/middleware'
// Run middlewares
try {
const limiter = rateLimit({
keyGenerator: function (req: any) {
return req.headers["x-forwarded-for"] || req.connection.remoteAddress;
}, // Needed because of issue : https://issueexplorer.com/issue/nfriedly/express-rate-limit/254
windowMs: 60 * 1000, // 1 minute
max: 5, // 5 requests per IP
})
await runMiddleware(req, res, limiter)
} catch {
res.status(500)
res.end(JSON.stringify({errorCode: 'unknown', errorValue: ''}))
return
}
if (req.method === 'POST') {
res.status(200)
res.end(JSON.stringify({errorCode: 'ok', errorValue: ''}))
}我看不出这两种情况之间的区别,这可以解释为什么在我的第二种情况下不起作用。有人有解释吗?
提前谢谢。
发布于 2021-11-07 11:37:44
@juliomalves在评论中给出了答案:
“这是因为您在每个请求中声明并分配限幅器值,每次都会调用rateLimit。尝试将限制器声明移到处理程序函数之外。”
https://stackoverflow.com/questions/69857895
复制相似问题