如果中間件函數沒有在同一個文件中定義,為什麼我的中間件函數不起作用?

西爾萬

我面臨以下問題:

案例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: ''}))
    }

我看不出這兩種情況之間的差異可以解釋它如何在我的第二種情況下不起作用。有人有解釋嗎?

提前致謝。

西爾萬

@juliomalves 在評論中給出了答案:

“那是因為你在每個請求上聲明並分配值給限制器, rateLimit 每次都會被調用。嘗試將限制器聲明移到處理程序函數之外。”

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

為什麼我的 PDF 沒有在我的 Node 函數中間歇性地保存?

為什麼我的另一個文件中的 void 函數沒有在這個 C 程序中運行?

為什麼某些 CSS 函數在我的 WPF WebBrowser 元素中不起作用?

為什麼提示在我的函數中不起作用?

為什麼我們應該在聲明函數的同一個文件中包含函數原型的頭文件?

為什麼我在構造函數中填充的這個數組在構造函數返回後沒有填充?

為什麼 GETDATE() 函數在 IF 條件下不起作用?

為什麼我的函數 encodeChar 不起作用?

那麼,為什麼我必須在基類中定義虛函數?

為什麼賦值在 lambda 函數中不起作用

為什麼標準 ml 中的此函數附加列表不起作用?

CS50/Substitution – 為什麼 tolower() 函數在我的代碼中不起作用?

在循環中製作一個簡單的菜單來調用函數,堅持為什麼它不起作用

為什麼我在 C 中的 main 函數只打印第一個 for 循環?

為什麼我在 reactjs 中的功能組件映射一個空數組?

為什麼這個 for 循環起作用而函數不起作用?

為什麼在python中沒有執行異步函數

為什麼我不能在函數中設置我的構造函數?

兩個字符串之間的 JavaScript 提取在 map 函數中不起作用

為什麼我的 onsubmit 驗證函數沒有提交我的函數?

為什麼在函數中返回一個指針?

為什麼我不能在 tkinter 綁定中調用函數?

為什麼我的函數對除了塊不起作用?

如果我在函數頂部切換註釋行的位置,為什麼我的代碼不起作用?這是一個記憶回憶聲明

為什麼一個函數會導致組件重新渲染,而另一個函數不會導致 Nextjs?

自定義函數在模板中不起作用

這個函數有什麼作用?我收到一個 AttributeError

為什麼 Python 的 yield 語句不能在一個函數中調用,也不能在它調用的另一個函數中調用,為什麼在嘗試時沒有報告錯誤?

ContinueWith() 中的函數不起作用