2016-06-18 13 views
0

我的web應用程序是99%靜態的,除了在頁面加載時,如果他們已經登錄,我想向客戶端發送他們的用戶名和他們連接到的房間的名稱(如果他們在URL中指定的話)。這兩個變量需要在客戶端Javascript中訪問。所以我一直在試圖弄清楚什麼感覺像一個簡單的任務,但我運氣不大。如何在頁面加載時從節點服務器向JavaScript客戶端發送變量?

  1. 使用模板引擎。

    • 問題:矯枉過正,因爲我只需要一個/兩個變量原本靜態的頁面上,我需要訪問它在JavaScript中,而不是HTML
  2. 讓頁面後一個AJAX請求負載

    • 問題:導致閃爍,因爲首先在頁面加載,然後DOM更新一兩秒鐘後,因爲要等待要發送和接收的請求。而且它效率不高,因爲它需要第二個請求/響應。
  3. 使用WebSockets

    • 問題:上面那個問題一樣。
  4. 發送它的頭信息在頁面加載

    • 問題:除非你做a weird hack這隻能作爲一個單獨的AJAX調用無法訪問在Javascript頭信息。可以使用#2。

所以我結束了用餅乾做這個工作的,100%。目前實際上沒有任何問題,我只是認爲代碼非常醜陋而且很脆弱,我正在尋找更好的方法。這是一個什麼樣的餅乾解決方案看起來像一個片段:

app.get('/room/:roomName', function(req, res) { 
    res.clearCookie('room'); 

    if (req.isAuthenticated()) { 
     res.cookie('username', req.user.username); 
    } else { 
     res.cookie('username', ''); 
    } 

    var roomName = req.params.roomName; 

    if (roomNameToRoom.hasOwnProperty(roomName)) { 
     res.cookie('room', req.params.roomName); 
    } 

    res.sendFile(path.join(__dirname, '../public/index.html')); 
}); 

正如你可以看到我抓住從請求的用戶名和驗證的房間,如果它是有效的,我發送回來。然後我在客戶端使用RegEx解析cookie(非常混亂),並在JavaScript函數中使用這兩個變量。我正在尋找其他解決方案,這將允許我在一個請求中發送這一切,同時避免複雜性和混亂。

回答

0
  1. 重定向到特殊的URL,例如index.htm?var1=5&var2=6並在JS中使用location.search.substr(1).split('&')

  2. 在html中使用嵌入js-file,例如<script src='ajax.js'></script>。在這個例子中,ajax.js沒有被緩存,並且包含如下內容:

    window.var1 = 5; 
    window.var2 = 6; 
    

    它可以動態生成。

  3. 使用cookie。

順便說一句,我不認爲使用模板是不好的。您可以使用JavaScript模板。它不應該是性能問題,因爲模板速度很快,而且您只需要執行一個模板。我會使用模板。

+0

你會推薦哪種模板?我發現的那些HTML代碼太複雜了,不適合我。儘管我傾向於#6。我能否在服務器端不使用文件的情況下使用#6?就像在服務器上假裝JSON對象是客戶端上的'ajax.js'。 –

+0

我不會建議一些確切的模板,但你可以創建node.js服務器,它使用指定擴展名的文件(如php解釋器)。 #6你可以隨心所欲地做。 – vitaliydev

相關問題