Nodejs 建议限制每人每天只能发10贴
Nodejs 建议限制每人每天只能发10贴
如题!
4 回复
Node.js 实现每日发帖限制为10条
背景
在许多社区应用中,为了避免用户滥用功能或恶意刷屏,通常会对用户的发帖数量进行限制。比如,我们希望每个用户每天最多可以发布10条帖子。本文将介绍如何使用Node.js来实现这一功能。
技术栈
- Node.js: 服务器端JavaScript运行环境。
- MongoDB: 用于存储用户数据和发帖记录。
- Express.js: 一个简洁而灵活的Node.js Web应用框架,提供了一系列强大的特性来开发Web应用。
步骤
-
设置数据库 首先需要创建一个MongoDB集合来存储用户的发帖记录。例如,我们可以有一个
post_records
集合,其中包含用户的ID、发帖日期和发帖次数等信息。 -
中间件实现 创建一个中间件函数来检查用户是否已经达到了当天的发帖上限。如果达到,则返回错误响应;否则,允许用户继续发帖并更新发帖记录。
-
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
}
实现步骤
- 验证用户发帖权限:检查用户当天是否已经发了超过10条帖子。
- 更新数据库:如果用户还有发帖机会,则更新数据库并允许发帖;否则,拒绝请求。
示例代码
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("达到每日发帖限制");
}
})();
解释
- 数据库模型:定义了一个简单的用户模型,包含用户名、当日发帖次数和最后发帖日期。
- 函数
checkAndLimitPosts
:该函数首先检查用户是否存在,如果不存在则创建新用户。然后检查是否是同一天,如果是并且发帖次数已达到10次,则返回false
。否则,增加发帖次数,并更新最后发帖日期。 - 使用示例:调用
checkAndLimitPosts
函数来判断当前用户是否还能发帖。
这种方式可以有效地限制每个用户每日的发帖次数。