Node / Express中GET和POST请求之间的时间间隔

时间:2017-07-05 11:41:05

标签: javascript node.js express middleware

我正在使用Node / Express构建测验网站。

如何确保用户在指定的时间段内提交测验而不使用客户端javascript?也就是说,如果测验需要10分钟,那么事后的提交应该标记为为时已晚。

GET和POST请求都是相同的URL

2 个答案:

答案 0 :(得分:2)

关于你想要的安全级别和不良连接性,但我要做的是在向客户端提供quizz时​​启动计时器服务器端,如果在给定后提交了答案则拒绝它期间(1000万加一点差价)。

为了让客户端知道,您可以编写一个客户端计时器,该计时器将服务器在服务页面时直接在客户端html中设置值作为开始时间。

希望这有帮助!

答案 1 :(得分:2)

我在评估应用中遇到了同样的问题。

以下是我保存新日期的方式,以便稍后检查服务器上的时间是否大于我的答案:

客户代码:

startEvaluation: function (data) {
        return $http.put(startUrl + '/' + data._id,data);
      },

服务器代码:

exports.startEvaluation = function (req, res) {
  if(req.body.status==="NEW")req.body.status="STARTED";
  req.body.started=Date.now();
    Evaluation.findOneAndUpdate({_id: req.body._id}, req.body, {upsert:true , new: true }, function(err, evaluation)
    {
       if (err) {
            return handleError(res, err);
         }
         if (!evaluation) {
            return res.send(404);
         }
    });
};

希望有所帮助

修改

正如您所说的是相同的网址,您可以使用参数(例如新的参数)。这样,如果您使用NEW条件回答,则只需调用begin方法:

exports.answer = function (req, res) {
  if(req.body.status==="NEW")
  {
    req.body.status="STARTED";
    req.body.started=Date.now();
  }
  else
  {
    //Process answer here and compare another Date.now() with the stored date, and your time limit to answer
    console.log("answer");
  }

    Evaluation.findOneAndUpdate({_id: req.body._id}, req.body, {upsert:true , new: true }, function(err, evaluation)
    {
       if (err) {
            return handleError(res, err);
         }
         if (!evaluation) {
            return res.send(404);
         }
        //here is the updated evaluation with the started value.
        return res.json(200, evaluations);

    });
};

客户端上的方法:

 $scope.saveAnswer = function ()
            {

                if($rootScope.evaluation.status==="NEW")
                {
                    evaluationService.startEvaluation($rootScope.evaluation);
                }
                else
                {
                  //Your answer treatment
                } 

}
  

无论如何,服务器上的一点改进可以检查测试   必须开始允许回答。

编辑

  

这是服务器控制状态的代码   从背面评估/测验。这允许您标记为   "过时"用户在允许期间未完成的评估   在测验开始后20分钟。请注意setTimeout是   完成将任务留在服务器端,等待达到最大时间   配置(例如20分钟)

function marcarNoTerminada(id, body) {      
         //later you can check the status to filter answers given after limit hour
         body.status="NOT FINISHED";
         Evaluation.findOneAndUpdate({_id: id}, body, {upsert:true , new: true }, function(err, evaluation)
    {
       console.log("Evaluacion sin finalizar");
    });
}

exports.startEvaluation = function (req, res) {
  if(req.body.status==="NEW")req.body.status="STARTED";
  req.body.started=Date.now();
  req.body.validEnd= new Date(req.body.started+(60000*20));

    var theTimer = setTimeout(function(){marcarNoTerminada(req.body._id, req.body);}, 60000*20); 
    Evaluation.findOneAndUpdate({_id: req.body._id}, req.body, {upsert:true , new: true }, function(err, evaluation)
    {
       if (err) {
            return handleError(res, err);
         }
         if (!evaluation) {
            return res.send(404);
         }

        return res.json(200, evaluation);
    });
};