如何限制用户每日发帖限制 (MERN)

Posted

技术标签:

【中文标题】如何限制用户每日发帖限制 (MERN)【英文标题】:How to limit users daily post limit (MERN) 【发布时间】:2021-06-24 14:51:01 【问题描述】:

我目前使用passport进行身份验证,使用mongodb存储用户信息。

但是,我一直在尝试限制用户的每日发帖限制。我正在考虑在用户架构中设置一个像每日发布限制这样的字段,并且每当用户发布某些内容时,我都会扣除计数。

const user = new mongoose.Schema(


githubId: 
    required: true,
    type: String,
  ,

  username: 
    required: true,
    type: String,
  ,

  dailyPostLimit: 
    type: Number,
    default: 3,
  ,
);

但是我不确定是否有办法每天将该计数重置为默认值 (3)。 CRON 任务适合这里还是有更简单的方法来完成这个?

【问题讨论】:

【参考方案1】:

cron 任务非常适合重置像这样的值,并且缓存像这样的值是解决此问题的合理方法。但是,请记住,您正在缓存此值,并且缓存失效是一个困难问题,通常会导致错误和额外的复杂性。

统计帖子

我的第一个直觉不是缓存,而是每次计算帖子的数量。这是一些伪代码:

const count = await posts.count(userId, createdAt: $gte: startOfDay);
// alternative: const count = await posts.count(userId, _id: $gte: startofDayConvertedToMongoId);
if (count > 3) throw new Error("no more posts for you");
await posts.create(newPost)

(注意:如果您担心竞争条件,任何您选择的解决方案都需要检查事务中的计数)

如果您有一个以userId: 1, createdAt: 1 开头的索引,或者如果您使用_id 而不是userId: 1, _id: 1(假设您不允许客户端_id 创建),这些查询将非常便宜,并且他们很难不同步。

单独的缓存集合

即使您决定缓存这些创建值,我还是建议您将它们从用户的集合中缓存起来,以使您的集合更加集中。您可以创建一个post_count 集合,然后仅更新这些计数的缓存集合:post_count.updateOne(userId, day, $incr: count: 1, $setOnInsert: day, userId, count: 0, upsert: true);。这种方法的一个好处是您可以在day 上使用ttl 索引,让mongo 在此集合中的旧文档过期后自动删除它们。

【讨论】:

【参考方案2】:

由于您使用的是 MongoDB,我建议您,

    使用 agenda 并创建在 UTC 00:00(如果您有来自不同时区的不同用户)或特定于您用户所在国家/地区的时区运行的作业。 在此作业中,调用user 模型上的updateMany 函数以重置dailyPostLimit 字段。

【讨论】:

以上是关于如何限制用户每日发帖限制 (MERN)的主要内容,如果未能解决你的问题,请参考以下文章

Twitter api - 可以发帖吗?

获得用户许可后,如何在 Facebook 的用户墙上发帖?

如何限制 UIButton 标题文本溢出

PHP实现验证码

在 Wordpress 中,如何将帖子限制为仅一个类别复选框?

如何在朋友的墙上发帖?