2017-07-25 22 views
2

我希望有人能幫助我。Meteor - 服務器從所有客戶端表單中提取數據?

我嘗試爲以下方式工作的事件構建測驗遊戲。

我有一個遊戲集合,這有很多問題。那些又有不同的類型,答案和倒計時。

管理員必須開始遊戲,遊戲開始第一個問題並設置倒計時。

倒計時結束後,forminput應該被禁用,我想從所有連接到遊戲的客戶端收集數據。

有沒有辦法在倒計時運行後從服務器端的所有客戶端提取數據而在客戶端沒有提交的情況下在服務器端觸發方法?

回答

2

我在項目中使用了類似的東西,也許這是解決您的問題。

服務器端計數器和模板級別認購

讓您的客戶訂閱有獎問答集,其中每個文件代表當前測驗邏輯

該文檔包含有關它是否已啓動,倒數長度和(重要!)剩餘當前時間的信息。倒計時在服務器上更新,從而更新文檔。

一個最小的例子是:

  • 開始 - 布爾(觸發由管理員測驗開始)
  • 時間 - 數字(例如在幾秒鐘內,你的倒計時的總長度)
  • 的timeleft - 數(這是左當前時間,由計數器寫入到DOC)
  • timeUp - 布爾(到觸發器將結果發送)

爲什麼?因爲您將在服務器上更新倒計時,並將剩餘時間寫入文檔。這樣就消除了問題,即客戶可以操縱他們的倒計時(因此可能還剩下整體時間),他們將時間與服務器同步,而不是與服務器同步。

還可以在服務器上檢查與管理員啓動/暫停相關的任何操作,包括userId/roles。這使得其他客戶無法開始/結束測驗。

一旦時間到了,您會在文檔中寫入一個標誌(例如timeUp),該時間到了。這又可以在客戶端中反應性地觸發一個模板事件,它使得每個客戶端調用一個服務器方法並將其結果發送給服務器。

使用模板級別訂閱將是一個例子:

Template.quiz.onCreated(function() { 
    const instance = this; 
    instance.state = new ReactiveDict(); 
    instance.state.set('timeLeft', -1); 
    instance.state.set('started', false); 

    const quizId = /* ... params to load your quiz document */ 

    instance.autorun(function() { 

     const subscription = instance.subscribe("quizpublication"); 
     if (subscription.ready()) { 
      instance.state.set("loadComplete", true); 
     } 


     const quizDoc = Quiz.findOne({}) 
     if (!quizDoc) return; //skips until subscriptions are ready 
     if (quizDoc.started && !intance.state.get("started") { 
      Meteor.call("startQuiz", {_id:quizDoc._id}); // trigger the counter start on the server 
      instance.state.set('started', quizDoc.started); 
     } 

     instance.state.set('timeLeft', quizDoc.timeLeft); //updated on the server, updated here 

     if (quizDoc.timeUp) { 
      Meteor.call("sendMyQuizresults", {/* your results from the form input*/}, function(err, res){ 
       //... 
      }); 
     } 
    }); 
}); 
+0

這是我的想法也一樣,通過收集處理它,我認爲有可能通過剛剛通過從客戶收集所有的東西了「shortway」解決方案套接字連接。 但謝謝;)生病嘗試這種方式 – xQp

+0

流星收藏和DDP已經爲你做了所有的辛苦工作,利用它! –

相關問題