前序
使用nosejs做了个简单服务,推送微信消息。突然有一天,微信收到大量垃圾信息,有个ip再疯狂调用我们的接口。由于前期没有估算太多,前端接口暴露出来后被别人恶心调用了。于是使用express-rate-limit来限制ip访问,前端使用CryptoJS加密。本地测试没问题,上线后遇到的问题
问题
const totalHits = (this.hits[key] ?? 0) + 1;
^
SyntaxError: Unexpected token '?'
................
猜测是node版本问题
解决过程
查看官网后发现issues,果然如此。降版本使用5后出现如下
const limiter = rateLimit({
^
TypeError: (0 , express_rate_limit_1.default) is not a function
at bootstrap (C:\work\puga-website\service\src\main.ts:25:28)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
那肯定是import引用方法变更了。于是
import * as rateLimit from 'express-rate-limit'
ok.正常启动
总结
出问题后第一时间去看官网github issues
我本地没有问题,那是因为我本地node>16,而express-rate-limit@6要求node>14,我们生产服务器上是node=12,但是又不能升级node,因为这台服务器上还有其他服务。
如果使用docker部署就可以解决这种情况,node要求版本不一样。但是由于是历史原因,,,,
至于加密解密,这个自己定义一下产生公钥的规则就可以了。前端还限制了不能F12调试等。但是这个措施都是防君子不妨小人。为了用户体验,没有添加验证码的人机验证。