【问题标题】:Timing interval between GET and POST request in Node/ExpressNode/Express 中 GET 和 POST 请求的时间间隔
【发布时间】:2017-07-05 11:41:04
【问题描述】:

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

如何确保用户在指定时间段内提交测验而不使用客户端 JavaScript?也就是说,如果测验需要 10 分钟,则之后提交应标记为太晚。

GET 和 POST 请求都指向同一个 url

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    取决于您想要的安全级别和不良连接防护,但我会在向客户端提供测验时启动一个计时器服务器端,如果答案在给定之后提交,则拒绝它期间(1000 万加上一点保证金)。

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

    希望这会有所帮助!

    【讨论】:

    • 是的。我明白了。我只是欣赏示例代码来说明这一事实,因为我不知道 POST 请求处理程序如何从 GET 请求处理程序获取时间变量
    • 我不会发布代码,因为有人在下面的答案中这样做了,但我会简单地阅读服务器端的提交时间。因为如果您从客户端发送的表单中读取它,您将承担用户修改表单输入或弄乱他的 PC 时间设置的风险。
    【解决方案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);
        });
    };
    

    【讨论】:

    • 谢谢亚历杭德罗。 NEW参数是否默认为bodyParser
    • 欢迎您!我只是在用户查看测验的第一个屏幕时在 body 上创建参数(我的限制只有 20 分钟 - 20 个答案,然后我只在第一个之前检查)。当用户阅读规则并开始测验时,Thay 会告诉我。之后,在每个答案中,我都会检查用户是否超过了限制。无论如何,您可以为每个答案使用特定的计时器,但应该有所改进。
    • 对不起。我的意思是问 request.body.STATUS
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多