NodeJs / MongoDB - 在用户可以再次发布/提交之前等待X时间

时间:2016-12-28 18:15:53

标签: javascript jquery node.js mongodb mongoose

我正在建立一个视频评级网站,用户可以在其中提交视频,但我希望避免用户使用他们的视频提交/垃圾邮件,并限制他们每小时或每次提交一次。什么是最好的方法呢?我一直在阅读有关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')
   });

});

我也在保存帖子提交的时间/日期,也许我应该使用它并将其与当前日期进行比较?非常感谢任何帮助: - )

2 个答案:

答案 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个视频一样。

下行是你可能需要一个故障保险,就像保存视频但未能进入失效收集时会发生什么?

有关TTL Index

的更多信息