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

Javascript NodeJs/MongoDB-在用户可以再次发布/提交之前等待X个时间,javascript,jquery,node.js,mongodb,mongoose,Javascript,Jquery,Node.js,Mongodb,Mongoose,我正在建立一个视频评级网站,用户可以提交他们的视频,但我想避免用户提交/滥发他们的视频,并限制他们每小时提交一次。最好的方法是什么?我一直在读关于SetTimeOut/Interval的书,也在读关于使用一些中间件的书,但还没有找到运气 在用户发布/请求此代码后,我想给他们一个超时/冷却时间 router.post('/submit', isLoggedIn, function (req, res, next){ User.findOne({_id: req.user._id}, func

我正在建立一个视频评级网站,用户可以提交他们的视频,但我想避免用户提交/滥发他们的视频,并限制他们每小时提交一次。最好的方法是什么?我一直在读关于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')
   });
}))


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

我认为使用服务器检查的最佳方法是使用中间件,类似于下面的中间件。我还没有测试过,但你可以按原样或做一些修改来尝试

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>
});
功能限制视频(req、res、next){
视频,芬顿({
ownByUser:,
},
{
创建日期:1
}
)
.sort({createdDate:-1})
.exec(函数(错误、数据){
如果(错误){
返回
}
如果(!数据){
返回
}否则{
var ONE_HOUR=60*60*1000;//以毫秒为单位
var lastPostdate=data.createdDate;
如果(((新日期)-lastPostdate)>=一小时){
next();
}否则{
返回
}
}
})
}
//在ur post路由中使用中间件
router.post('/submit',isLoggedIn,limitVideo,函数(req,res,next){
});

这听起来可能有些奇怪,但您可以使用另一个名为“失效”的集合,在createdDate上使用1小时的TTL索引,每当用户提交视频时,首先检查集合失效中是否有该用户ID的文档

如果没有这样的文档,则保存视频并在失效集合中输入userId和createdDate

如果已经有文档,则告诉用户他仍处于冷却期

这将在TTL索引在设置的时间(在本例中为1小时)后自行删除文档的意义上起作用

使用此功能,您还可以通过维护计数器来扩展此功能,就像在一小时左右的时间内只允许播放两个视频一样

缺点是您可能需要一个故障保险箱,就像它保存了视频但无法进入失效收集时会发生什么一样


更多关于

我建议检查该用户最近提交的视频并进行时间比较。否则,可能使用会话变量