2016-03-21 119 views
0

我正在使用AngularJS和NodeJS的Web應用程序,用戶必須在隨機生成的問題之間找到正確的答案。 我不知道如何「保護」客戶的答案。如何使用NodeJS保護/存儲對象服務器端?

的問題/答案中的對象產生這樣的:

var question = { 
    answer: 'A', 
    choices: ['A', 'B'] 
}; 

在這個例子中,用戶必須選擇一個與正確答案之間是一個

我想要做這樣的事情:

  1. 客戶端向服務器請求一個新的問題
  2. 服務器加載的問題/答案並返回選擇只給客戶
  3. 客戶端發送答案到服務器
  4. 服務器比較客戶端發送到他的答案答案,並將結果返回給客戶端(即正確或WRO NG)

由於提問/回答是隨機生成的,答案需要通過服務器的步驟1

我在思考着什麼樣後進行定義:

var answer = 0; 

app.get('/generateQuestion', function (req, res) { 
    var question = getQuestion(); 
    answer = question.answer 
    res.send(question.choices); 
}); 

app.post('/answer', function (req, res) { 
    if (req.answer === answer) { 
     res.send('Correct'); 
    } else { 
     res.send('Wrong'); 
    } 
}); 

但此存儲答案將用戶造成的衝突之間共享...

我想避免發送答案時提出問題的客戶端,但我不知道如何「商店」,它在服務器端。

你將如何處理它?我怎樣才能確保這個問題/答案?

+0

這實在是一個太普通的一個問題,但通常你會送可能的答案給瀏覽器一個唯一的ID沿將用於請求服務器的實際答案。通常的做法是使用[AJAX](https://en.wikipedia.org/wiki/Ajax_(編程))瀏覽器到服務器請求(不需要刷新頁面)和某些數據庫服務器,可以讓你存儲問題,可能的答案,以及由唯一ID索引的實際答案。 –

+0

@RobRaisch感謝羅布。我沒有提到它,但我不能將問題/答案存儲在數據庫中(這會更容易...)。我只是從第三方API中隨機生成它們。我不想存儲它們,因爲它們只能使用一次。但可能是我應該將它們臨時存儲在JSON文件中,然後在「測驗」之後刪除。 – Alex

回答

1

我不能添加評論,所以我必須張貼此作爲一個答案,但我會使用類似快遞會話將自動將數據存儲在數據庫中保存的用戶會話的提問/回答您設置它。您可以通過將問題/答案對存儲在數組中,然後將問題發送到客戶端,並將其數組中的索引發送給客戶端。然後他們可以將答案和索引發送到數組中,並且可以檢查答案是否正確。

+0

感謝您的回答亞當。正如我在對Rob的評論中提到的,我不想將QA存儲在數據庫中。它們是暫時的,並且一直在變化你認爲用戶之間的共享陣列是一個好主意嗎?一旦用戶回答(或在一段時間之後),我可以從陣列中刪除QA。我也在考慮每個用戶的臨時文件。你怎麼看待這件事? – Alex

+0

嗨,是的,您可以將它們存儲在共享陣列中,但我認爲這不是最佳實踐。你提到你不想將它們存儲在數據庫中,但是之後建議將它們存儲在臨時JSON文件中並在測驗之後刪除?一個NoSQL數據庫將完全執行這個功能,並且將是一個更加標準的方法。快速會話甚至隱藏了從代碼訪問/保存的整個數據庫,您只需像普通變量一樣訪問。 – Adam

1

你可能會考慮編碼問題,選項可供選擇,並在瀏覽器端的JavaScript正確答案以這樣的方式來從隨意觀看隱藏起來。

注意這個不會完全保護來自任何人,但不熟練的用戶的答案,但它會給你一些隱私。

這裏是我建議(見直播在jsfiddle)解決方案:

<div>Q:&nbsp;<span id="q"></span></div> 
<div>1:&nbsp;<span id="o1"></span></div> 
<div>2:&nbsp;<span id="o2"></span></div> 
<div>3:&nbsp;<span id="o3"></span></div> 
<div>Placeholder:&nbsp;<span id='p'></span></div> 
<div>A:&nbsp;<span id='a'></span></div> 

<script> 
    var cc=''.charCodeAt,sh=[].shift,jo=[].join,sp=''.split, 
     ma=[].map,fc=String.fromCharCode,lo=''.toLowerCase, 
     fe=[].forEach, 
     /* #1 */ r=function(s){ 
     var f=function(c){ 
      var v=cc.call(lo.call(c)),t=v>=96,k=(v-96+12)%26+1; 
      if(v<97 || v>122) return c; return fc(k+(t?96:64)); 
     }; 
     return jo.call(ma.call(sp.call(s,''),f), ''); 
     }, 
     /* #2 */ d=[ 
     'Gur dhrfgvba gb nfx?', // The question to ask? 
     'Svefg cbffvoyr nafjre', // First possible answer 
     'Frpbaq cbffvoyr nafjre', // Second possible answer 
     'Guveq cbffvoyr nafjre', // Third possible answer 
     '[Naq gur nafjre vf...]', // [And the answer is...] 
     'Gur npghny nafjre!',  // The actual answer! 
     ], 
     /* #3 */ t=['q','o1','o2','o3','p','a']; 

    /* #4 */ fe.call(t,function(tr){ 
    document.getElementById(tr).innerText=r(sh.call(d)); 
    }); 
</script> 

  • #1:r是的Caesar Cypher
  • ROT13變化的混淆實施#2:d是一個ROT13編碼的字符串數組,應該在每次新任務時進行替換離子被呈現給用戶
  • #3:t是DOM元素ID的陣列,以確定在其中的元件插入解碼字符串
  • #4:插入解碼字符串到相應的元件。

當每個新的問題是從服務器,問題的編碼值,答案的選擇,佔位符的答案檢索,且實際答案本身在d取代的值。

在您的應用程序中,選項可能是單選按鈕,附帶onClick事件處理程序,它將檢查點擊選項與解碼答案以確定成功或失敗。

這裏是ROT13加密的未混淆的版本:

var rot13 = function(s){ 
    return s.split('').map(function(c){ 
     var v=c.toLowerCase().charCodeAt(0); 
     if(v<97 || v>122) return c; 
     var t = v>=96, 
      k = (v - 96 + 12) % 26 + 1; 
     return String.fromCharCode(k + (t ? 96 : 64)); 
    }).join(''); 
}; 
相關問題