首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果调用的函数没有在同一个文件中定义,为什么我的中间件功能不能工作?

如果调用的函数没有在同一个文件中定义,为什么我的中间件功能不能工作?
EN

Stack Overflow用户
提问于 2021-11-05 18:44:37
回答 1查看 221关注 0票数 1

我所面对的问题如下:

案例1(工作案例) :

文件middleware.ts (中间件函数库)

代码语言:javascript
复制
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入口点)

代码语言:javascript
复制
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 (中间件函数库)

代码语言:javascript
复制
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入口点)

代码语言:javascript
复制
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: ''}))
    }

我看不出这两种情况之间的区别,这可以解释为什么在我的第二种情况下不起作用。有人有解释吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-07 11:37:44

@juliomalves在评论中给出了答案:

“这是因为您在每个请求中声明并分配限幅器值,每次都会调用rateLimit。尝试将限制器声明移到处理程序函数之外。”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69857895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档