【发布时间】:2017-07-05 11:41:04
【问题描述】:
我正在使用 Node/Express 构建一个测验网站。
如何确保用户在指定时间段内提交测验而不使用客户端 JavaScript?也就是说,如果测验需要 10 分钟,则之后提交应标记为太晚。
GET 和 POST 请求都指向同一个 url
【问题讨论】:
标签: javascript node.js express middleware
我正在使用 Node/Express 构建一个测验网站。
如何确保用户在指定时间段内提交测验而不使用客户端 JavaScript?也就是说,如果测验需要 10 分钟,则之后提交应标记为太晚。
GET 和 POST 请求都指向同一个 url
【问题讨论】:
标签: javascript node.js express middleware
取决于您想要的安全级别和不良连接防护,但我会在向客户端提供测验时启动一个计时器服务器端,如果答案在给定之后提交,则拒绝它期间(1000 万加上一点保证金)。
为了让客户端了解,您可以编写一个客户端计时器,该计时器将在服务页面时将服务器直接在客户端 html 中设置的值用作开始时间。
希望这会有所帮助!
【讨论】:
我有同样的问题要在评估应用程序中解决。
这是我保存新日期的方式,以便以后在回答时超过我的限制时检查服务器:
客户端代码:
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);
});
};
【讨论】: