【发布时间】:2020-05-18 20:26:22
【问题描述】:
我正在使用 socket.io 并使用 rate-limiter-flexible 和 limiter 来限制请求率,但我注意到路由 /socket.io 没有收到来自任何一个的 429,事实上,我无法记录任何来自该路由的请求使用app.use('/socket.io')..
我认为 socket.io 正在对这条路线进行一些处理,对吗?如果是这样,我如何确保在达到限制后对 /socket.io 的请求也收到 429?
Connect 上的速率限制器:
this.io.on(this.SocketConstants.CONNECTION, async (client) => {
this.client = client;
try {
await this.rateLimiter.consume(client.handshake.address);
} catch (rejRes) {
// On flood
client.error('Too many requests');
client.disconnect(true);
}
http 服务器上的速率限制器:
class RateLimiting {
constructor() {
this.limiter = new RateLimiter(2, 'minute', true);
this.index = this.index.bind(this);
}
index(req,res,next){
try {
this.limiter.removeTokens(1, function(err, remainingRequests) {
if (remainingRequests < 1) {
res.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
res.end('429 Too Many Requests - your IP is being rate limited');
// res.status(429).json({ message: 'Too many requests' });
} else {
next();
}
});
}
catch(err){
console.log('Error', err);
}
}
}
编辑
对于遇到类似问题的任何人,我最终尝试了几种不同的方法来完成此任务,其中最简单的是:
- 编写自己的allowRequest
AllowRequest 是一个通过/失败函数,您可以使用它来覆盖默认的“checkRequest”函数 (reference here)
checkBucket(err, remainingRequests) {
remainingRequests < 1 ? false : true;
}
allowRequest(req, callback) {
const limit = this.limiter.removeTokens(1, this.checkBucket);
callback(limit ? null : 'Too many requests', limit);
}
并且服务器启动为
this.io = this.socketServer(server,
{
allowRequest: this.allowRequest
});
- 选择不同的路由,使用 express 添加任何需要的中间件并禁用默认路由
您可以通过将 serveClient 设置为 false 并将 path 设置为您需要的任何值来完成此操作。
this.io = this.socketServer(服务器, { 路径:'/newSocketRoute', 服务客户端:假 });
这对我来说不太奏效,所以我提供套接字文件的方式可能有问题,但这就是它的样子:
app.get("/socket", this.limiter.initialize(), function(req, res) {
if (0 === req.url.indexOf('/newSocketRoute/socket.io.js.map')) {
res.sendFile(join(__dirname, "../../node_modules/socket.io-client/dist/socket.io.js.map"));
} else if (0 === req.url.indexOf('/newSocketRoute/socket.io.js')) {
res.sendFile(join(__dirname, "../../node_modules/socket.io-client/dist/socket.io.js"));
}
});
【问题讨论】:
-
顺便说一下,rate-limiter-flexible 有RateLimiterQueue 与限制器包的功能相同。
标签: node.js socket.io rate-limiting