📜  快递限速redis - Javascript代码示例

📅  最后修改于: 2022-03-11 15:01:51.645000             🧑  作者: Mango

代码示例1
import { Request, Response, NextFunction } from 'express'
import IORedis from 'ioredis'
import ip from 'request-ip'

let io = new IORedis({
    host: process.env.REDIS_HOST || 'localhost',
    port: parseInt(process.env.REDIS_PORT || '')
})

export async function rateLimiterById(req: Request, res: Response, next: NextFunction): Promise {
    // store id to redis
    await io.set(`redis-id:${req.payload.uid}`, req.payload.uid)
    // get request by id
    const getId = await io.get(`redis-id:${req.payload.uid}`)
    // counter count request
    const maxCounterRequest = await io.incrby(`counter-id:${req.payload.uid}`, 1)

    if (getId === req.payload.uid && maxCounterRequest <= 50) {
        await io.expire(`counter-id:${req.payload.uid}`, 10)
    } else {
        await io.del(`redis-id:${req.payload.uid}`)
        return res.status(429).json({
            status: 'ERROR TO MANY REQUEST',
            code: 'AX2AC5R',
            message: 'cannot access this endpoint, after 10 second is over'
        })
    }

    next()
}

export async function rateLimiterByIp(req: Response, res: Response, next: NextFunction): Promise {
    const getIp = ip.getClientIp(req)
    // store id to redis
    await io.set(`redis-ip:${getIp}`, `${getIp}`)
    // get request by id
    const getStoreIp = await io.get(`redis-ip:${getIp}`)
    // counter count request
    const maxCounterRequest = await io.incrby(`counter-ip:${getIp}`, 1)

    if (getStoreIp === getIp && maxCounterRequest <= 50) {
        await io.expire(`counter-ip:${getIp}`, 10)
    } else {
        await io.del(`redis-ip:${getIp}`)
        return res.status(429).json({
            status: 'ERROR TO MANY REQUEST',
            code: 'AX2AC5R',
            message: 'cannot access this endpoint, after 10 second is over'
        })
    }

    next()
}