【发布时间】:2020-08-27 04:26:52
【问题描述】:
我正在创建一个用户管理系统。版主可以选择在特定天数内阻止用户。收到阻止请求后,在数据库中将用户的 disabled 属性设置为 true。经过指定的持续时间后,该值将重新设置为 false。持续时间可以从 1 到 10 天不等。 setTimeout() 是正确的选择吗?如果同时为多个用户运行,是否会占用大量 CPU 资源?
这是我程序中的函数。完整程序使用express作为服务器,mongoose与mongodb数据库交互。
function disableUser(req,res) {
let username = req.body.username;
let app = req.body.app;
let duration = req.body.duration;
let reason = req.body.reason;
User.find({username:username}).then((result) => {
let user = result[0];
user.disabled = true;
user.save().then((user) => {
disableMail(app, user.email, duration, reason); //send mail to user
// schedule a task to set user.disabled to false after the duration
}, (err) => {
res.status(500).send(err);
});
}, (err) => {
res.status(500).send(err);
});
}
编辑: 看到所有的 cmets 和答案,我想我会实现这样的事情:存储禁令的结束日期(使用类似 momentjs 的东西计算)以及 disabled 属性。 setInterval 将单独运行,并每 12 小时检查所有禁用设置为 true 的用户的日期。如果 end_date 与当前日期匹配,则 disabled 属性将设置为 false。
【问题讨论】:
-
您想要一个持续 1-10 天的 setTimeout 吗?似乎有点过分,而且很可能甚至无法使用您可能拥有的设置。绝对没有必要。发布更多详细信息和一些示例代码。
-
@user120242 我已经添加了有问题的函数。您所说的“甚至无法使用您可能拥有的设置”是什么意思? setTimeout 有使用限制吗?
-
一个天真的和基本的尝试将代替禁用属性,您将存储日期并使用当前的禁令持续时间延长此日期。此用户将被禁止一段时间。
-
使用该方法,您可以计算出他们是否被禁止
-
更好的解决方案是在数据库中存储 bock 状态和天数,并运行一个定时运行的 cron 并监视,如果时间到了,它将恢复任何被阻止用户的状态。跨度>
标签: javascript node.js