2017-07-05 9 views
3

Node/Expressを使用してクイズウェブサイトを構築しています。ノード/エクスプレスのGETリクエストとPOSTリクエストのタイミング間隔

クライアントサイドのJavaScriptを使用せずに、指定した時間内にクイズを送信するにはどうすればよいですか?つまり、クイズに10分かかった場合は、それ以降の提出は遅すぎるとマークする必要があります。

両方GETとPOSTリクエストは同じURLにしたいセキュリティと悪い-コネクティビティ・proofnessのレベルで

答えて

2

依存しているが、私はどうなることクイズが提供されている場合、タイマー、サーバー側を起動しています所定の期間(1000万プラス少し余裕)の後に回答が提出された場合は拒否します。

クライアントの認識を維持するために、ページを処理するときにサーバーによってクライアントhtmlに直接設定された値を開始時刻として使用するクライアント側タイマーをコーディングすることができます。

希望すると便利です。

+0

はいに達するのを待って、サーバー側のタスクを残すために行わ であることに注意してください。私はそれを得る。 POSTリクエストハンドラがGETリクエストハンドラから時間変数を取得する方法がわからないため、事実を説明するサンプルコードがありがたいです。 – segunchrist

+0

以下の答えでいくつかの男がそれをしたのでコードを投稿しません。私は単にサーバー側の送信時刻を読むだけです。クライアントから送信されたフォームからそのフォームを読み取ると、ユーザーがフォーム入力を変更したり、自分のPCの時刻設定を変更したりする危険性があります。 –

2

評価アプリで解決するのと同じ質問がありました。ここで

は私が答える時が私の限界値よりも大きい場合には、後に、サーバー上で確認することができ、新たな日付を保存する方法です。

クライアントコード:

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

Serverのコード:

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); 
     } 
    }); 
}; 

それは

のお役に立てば幸いです

EDIT:

あなたは同じURLです、あなたは(たとえば、新しいのような)パラメータを使用することができます言ったように。クライアント上のメソッド

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); 

    }); 
}; 

:あなたが新しい条件と答える場合は、この方法では、あなただけのbeginメソッドを呼び出すとにかく

$scope.saveAnswer = function() 
      { 

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

} 

、少しはサーバー上で改善できます応答を許可するには、 のテストをチェックする必要があります。

EDITここ

サーバが裏側から 評価/クイズの状態を制御するためのコードです。これにより、クイズの開始から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); 
    }); 
}; 
+0

アレハンドロありがとうございます。 NEWパラメータのデフォルトはbodyParser – segunchrist

+0

Uです!私はちょうどユーザーがクイズの最初の画面を表示したときに本体にパラメータを作成します(私の制限はわずか20分です - 20回の回答、最初の1回前にチェックします)。 Thayは、ユーザーがルールを読んでクイズを開始したときに私に言います。その後、すべての回答で、ユーザーが制限を超えているかどうかを確認します。とにかく、あなたはすべての答えのための特定のタイマーでそれをすることができますが、少し改善する必要があります。 –

+0

すみません。私はrequest.bodyについて質問するつもりだった.STATUS – segunchrist

関連する問題