2016-08-24 119 views
3

您好我正在使用DDPRateLimiter限制meteor.js中的一些方法,我发现它限制了不仅仅是连接的每个人的方法调用!例如,对于这样的规则:Meteor.js:DDPRateLimiter限制是全局的,而不是每个连接

var updateUsernameRule = { 
    type: 'method', 
    name: 'updateUsername' 
}; 
DDPRateLimiter.addRule(updateUsernameRule, 1, 30000); 

在一个浏览器更新,然后在另一个更新时,它会导致限速错误。文档还不太清楚,默认行为根本不直观。我如何评价每个用户的限制?

回答

2

我同意,文档需要一些工作。为了使你的情况下,这个工作(限制通过登录唯一用户),你会希望类似如下:

const updateUsernameRule = { 
    type: 'method', 
    name: 'updateUsername', 
    userId(userId) { 
    if (userId) { 
     return true; 
    } 
    } 
}; 
DDPRateLimiter.addRule(updateUsernameRule, 1, 30000); 

这将导致updateUsernameRule规则只能用一组userId用户的匹配(登录用户)。所有其他未登录的用户将完全跳过此规则,并能够根据需要提出尽可能多的请求。

+0

您的解决方案对此有意义,但是如果我想限制发送的消息数量呢?如果我每秒钟执行10次方法调用的速率限制,那对单个用户来说是合理的。但是,如果我一次有100个用户登录,那么限制可能会受到影响。我刚开始考虑速率限制,我很惊讶用户不容易做到这一点。 – gkrizek

+0

我的答案中的速率限制规则是每个用户,因此每个用户在30秒内发出1个请求。如果您为每个用户配置了10个方法调用的限制,则100个用户将被允许每个方法调用10次方法调用,并且具有定义的时间间隔。 – hwillson

+1

谢谢。我想也许你的回答对我来说有点困惑。它是否检查每个呼叫的userId?或者只是检查用户是否有ID?基本上:是否限制所有登录用户每30秒1次请求或每30秒每个用户1次请求? – gkrizek

相关问题