Nodejs 建议限制每人每天只能发10贴

Nodejs 建议限制每人每天只能发10贴

如题!

4 回复

Node.js 实现每日发帖限制为10条

背景

在许多社区应用中,为了避免用户滥用功能或恶意刷屏,通常会对用户的发帖数量进行限制。比如,我们希望每个用户每天最多可以发布10条帖子。本文将介绍如何使用Node.js来实现这一功能。

技术栈

  • Node.js: 服务器端JavaScript运行环境。
  • MongoDB: 用于存储用户数据和发帖记录。
  • Express.js: 一个简洁而灵活的Node.js Web应用框架,提供了一系列强大的特性来开发Web应用。

步骤

  1. 设置数据库 首先需要创建一个MongoDB集合来存储用户的发帖记录。例如,我们可以有一个post_records集合,其中包含用户的ID、发帖日期和发帖次数等信息。

  2. 中间件实现 创建一个中间件函数来检查用户是否已经达到了当天的发帖上限。如果达到,则返回错误响应;否则,允许用户继续发帖并更新发帖记录。

  3. API接口 提供一个API接口让用户可以发送帖子,并通过上述中间件检查发帖限制。

示例代码

const express = require('express');
const mongoose = require('mongoose');

// 连接MongoDB
mongoose.connect('mongodb://localhost:27017/myapp', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义发帖记录模型
const PostRecordSchema = new mongoose.Schema({
    userId: String,
    date: { type: Date, default: Date.now },
    count: { type: Number, default: 0 }
});

const PostRecord = mongoose.model('PostRecord', PostRecordSchema);

// 创建Express应用
const app = express();
app.use(express.json());

// 发帖限制中间件
async function checkPostLimit(req, res, next) {
    const { userId } = req.body;

    // 检查用户今天是否已发帖超过10次
    const today = new Date().toDateString();
    const postRecord = await PostRecord.findOne({ userId, date: today });

    if (postRecord && postRecord.count >= 10) {
        return res.status(403).send({ message: '今日发帖已达上限' });
    }

    // 如果没有记录或未达上限,则调用下一个中间件
    next();
}

// 发帖API
app.post('/api/posts', checkPostLimit, async (req, res) => {
    const { userId } = req.body;

    // 更新发帖记录
    let postRecord = await PostRecord.findOneAndUpdate(
        { userId, date: new Date().toDateString() },
        { $inc: { count: 1 } },
        { upsert: true }
    );

    res.send({ message: '帖子发送成功', postCount: postRecord.count });
});

// 启动服务器
app.listen(3000, () => console.log('Server running on port 3000'));

解释

  • 数据库连接:使用Mongoose连接到本地MongoDB实例。
  • 模型定义:定义了一个PostRecord模型来存储发帖记录。
  • 中间件checkPostLimit中间件用于检查用户是否已经达到每日发帖上限。如果没有达到,则调用下一个处理函数(即发帖逻辑)。
  • API接口:定义了一个POST请求的API /api/posts,用于接收发帖请求。通过中间件检查后,更新用户的发帖记录。

通过这种方式,我们可以有效地控制每个用户每天的发帖数量,确保系统的健康运行。


为毛?

或者加连续发帖限制。30秒一帖。

Node.js 实现用户每日发帖限制

为了实现每人每天只能发10条帖子的功能,我们可以使用一个数据库来记录每个用户的发帖情况。以下是一种可能的实现方法:

数据库设计

假设我们使用MongoDB作为数据库,并且有一个集合(collection)用于存储用户信息以及他们每天的发帖次数。

// 用户集合结构
{
    _id: ObjectId,
    username: String,
    postsToday: Number,
    lastPostDate: Date
}

实现步骤

  1. 验证用户发帖权限:检查用户当天是否已经发了超过10条帖子。
  2. 更新数据库:如果用户还有发帖机会,则更新数据库并允许发帖;否则,拒绝请求。

示例代码

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义用户模型
const userSchema = new Schema({
    username: { type: String, required: true },
    postsToday: { type: Number, default: 0 },
    lastPostDate: { type: Date, default: Date.now }
});

const User = mongoose.model('User', userSchema);

async function checkAndLimitPosts(username) {
    const user = await User.findOne({ username });
    
    // 如果用户不存在,则创建新用户
    if (!user) {
        const newUser = new User({ username });
        await newUser.save();
        return true;
    }

    // 检查是否是同一天
    const isSameDay = user.lastPostDate.setHours(0, 0, 0, 0) === new Date().setHours(0, 0, 0, 0);
    
    if (isSameDay && user.postsToday >= 10) {
        return false; // 达到每日限制
    }

    // 更新发帖次数
    user.postsToday += 1;
    user.lastPostDate = new Date();
    await user.save();

    return true;
}

// 使用示例
(async () => {
    const canPost = await checkAndLimitPosts('testUser');
    if (canPost) {
        console.log("可以发帖");
    } else {
        console.log("达到每日发帖限制");
    }
})();

解释

  1. 数据库模型:定义了一个简单的用户模型,包含用户名、当日发帖次数和最后发帖日期。
  2. 函数 checkAndLimitPosts:该函数首先检查用户是否存在,如果不存在则创建新用户。然后检查是否是同一天,如果是并且发帖次数已达到10次,则返回false。否则,增加发帖次数,并更新最后发帖日期。
  3. 使用示例:调用checkAndLimitPosts函数来判断当前用户是否还能发帖。

这种方式可以有效地限制每个用户每日的发帖次数。

回到顶部