这个又是隐藏的云函数,跟WebSocket一样,这个云函数是运行在所有的云函数之前的,return true 才会去请求实际的云函数
1、新建云函数,固定命名为:__interceptor__
[upl-image-preview url=https://forum.laf.run/assets/files/2023-03-24/1679669781-220710-image.png]
2、添加依赖 nw-laf
查看使用nw-laf文档
该NPM依赖已经升级为nw-lafjs 后续nw-laf将不再升级:https://forum.laf.run/d/280
[upl-image-preview url=https://forum.laf.run/assets/files/2023-03-24/1679669912-481986-image.png]
3、替换云函数代码
import cloud from '@lafjs/cloud'
const nw = require('nw-laf')
const db = cloud.database()
const _ = db.command
const $ = _.aggregate
export async function main(ctx: FunctionContext) {
// 请求的实际IP
const ip = ctx.headers['x-real-ip']
// 添加请求IP到数据库,并自动添加 add_time
let requestIp = await nw.baseDao.add({
cloud:cloud,
dbName:"requestIp",
dataJson:{
ip:ip
},
})
//获取当前IP的时间段的访问次数
const Interval = 1 // 间隔分钟
const times = 60 // 间隔Interval分钟内限制最大访问次数
let timesRes = await nw.baseDao.select({
cloud: cloud,
dbName: 'requestIp',
// 主表where条件
whereJson: {
_add_time : _.and(_.gte(Date.now()-Interval*60*1000), _.lte(Date.now()))
}
})
// console.log(timesRes);
if(timesRes.total <= times){
// 返回 true 则会去继续请求实际的云函数
return true
}else{
// 返回 false 则不会去继续请求实际的云函数
return false
}
}
4、修改参数
修改Interval 和 times,示例代码意为1分钟内同一个IP最多可以访问60次
5、发布云函数
[upl-image-preview url=https://forum.laf.run/assets/files/2023-03-24/1679670051-305216-image.png]
大功告成!!后面请求任何其他的云函数都会去判断一下IP是否超过次数!