我正在建立一个视频评级网站,用户可以在其中提交视频,但我希望避免用户使用他们的视频提交/垃圾邮件,并限制他们每小时或每次提交一次。什么是最好的方法呢?我一直在阅读有关SetTimeOut / Interval以及使用一些中间件但尚未运气的信息。
用户发布/请求此代码后,我想给他们一个超时/冷却时间
router.post('/submit', isLoggedIn, function (req, res, next){
User.findOne({_id: req.user._id}, function (err, userfound){
var video = new Video({
title : req.body.title,
videoLink : req.body.videoLink,
category : req.body.category,
ownByUser : req.user._id,
});
video.save(function (err, moreVideo){
userfound.myFrags.push(moreVideo); //Error : Cannot read property 'push' of undefined
userfound.save();
});
res.redirect('/dashboard')
});
});
我也在保存帖子提交的时间/日期,也许我应该使用它并将其与当前日期进行比较?非常感谢任何帮助: - )
答案 0 :(得分:0)
我认为通过使用中间件(如下面的中间件)来使用服务器检查的最佳方法。我没有测试过,但你可以尝试它或进行一些修改,
function limitVideo (req, res, next) {
Video.findOne({
ownByUser : <userId>,
},
{
createdDate : 1
}
)
.sort({createdDate : -1})
.exec (function (err, data) {
if(err) {
return <Ur Err msg>
}
if(!data) {
return <Ur Err msg>
} else {
var ONE_HOUR = 60 * 60 * 1000; // in ms
var lastPostdate = data.createdDate;
if(((new Date) - lastPostdate) >= ONE_HOUR) {
next();
} else {
return <You cant upload videos>
}
}
})
}
// Use middleware in ur post route
router.post('/submit', isLoggedIn, limitVideo, function (req, res, next){
<Ur code>
});
答案 1 :(得分:0)
这可能听起来很奇怪,但你可以拥有一个名为&#39; lapse&#39;为了在createdDate上使用1小时的TTL索引,每当用户提交视频时,首先检查收集失效时该userId是否有文档。
如果没有此类文件,则保存视频并在失效集合中使用userId和createdDate创建一个条目。
如果已有文件,则告诉用户他仍处于冷却期。
这将起到TTL索引在这种情况下设置的时间后1小时自行删除文档的意义。
通过此功能,您还可以通过维护计数器来扩展功能,就像您在一小时内只允许2个视频一样。
下行是你可能需要一个故障保险,就像保存视频但未能进入失效收集时会发生什么?
的更多信息