我正在使用Node / Express构建测验网站。
如何确保用户在指定的时间段内提交测验而不使用客户端javascript?也就是说,如果测验需要10分钟,那么事后的提交应该标记为为时已晚。
GET和POST请求都是相同的URL
答案 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);
});
};