2012-10-31 112 views
2

從node.js服務器向客戶端的javascript發送一些數據(理想情況下爲json對象的形式)的最佳方式是什麼?我想到了一些選擇,但我認爲它們都不適合。第二個意見,或其他一些建議是我正在尋找的。從node.js向客戶端js發送數據的最佳方式

  1. 讓服務器在<script>標記中輸出一些代碼來設置全局變量。

    我以前用過這個,但我不喜歡它的想法,主要是因爲它對XSS有潛力,而且我認爲這是不好的做法,即使發送的數據不是由用戶定義的。

  2. 用它裏面的數據設置一個cookie。

    這個選項稍微好一點,但由於數據可能會因爲每次頁面加載而改變(至少在我的設置中),它並不適合,因爲在我看來,cookie不應該是這個不穩定。

  3. 讓客戶端javascript在頁面加載時向服務器發出ajax請求以請求json文件。

    這也適用,但它增加了很多不必要的開銷。每頁2個請求看起來沒有必要。

背景:

我有2個模板網站對註銷的用戶的索引,主要內容模板。

我的服務器端是由node.js,express.js,jade等構建而成的。

我使用history.pushState作爲客戶端頁面路由的所有鏈接和crossroads.js。 我希望能夠發送加載的模板和用戶的ID /如果他們登錄到客戶端JavaScript,所以它可以處理相應的頁面更改。登出的用戶可以查看內容頁面,而無需編輯權限,點擊某些鏈接應該將它們帶回索引模板。

回答

1

<script>標記方法很好。如果您擔心訪問數據的其他腳本,則不用設置全局變量,而是在可以接受數據的客戶端js代碼中編寫函數。

所以不是發生:

<script> 
    data = { foo : "bar" } 
</script> 

產生這樣的:

<script> 
    setData({ foo : "bar" }); 
</script> 

很顯然,我不認爲我需要告訴你,你產生的任何數據應通過適當的序列化JSON序列化程序以避免語法錯誤等。

+0

我確實結束了腳本標記選項。訪問js的其他腳本不是問題,因爲發送給客戶端的內容可能是惡意的。 我正在使用'JSON.stringify(object).replace('/','\ /','g')'來使任何XSS都不可能(據我所知)。 – xthexder

0

而是阿賈克斯你可以實現與任何Socket.ioNow的WebSockets(實現socket.io。這些不僅可以讓您輕鬆地傳遞數據來回客戶端和服務器之間,也可以讓客戶端調用的函數服務器

+0

我沒有看到使用套接字進行一次性傳輸的好處。我目前正在使用REST設置,因爲我的頁面不需要實時更新。 – xthexder

+0

最好的方法是將數據輸出到腳本標記中,減少1個Web請求。以爲我會提供其他的選擇,因爲我不知道這是一個簡單的請求。 –

1

只需將類型爲「text/template」或「application/json」的<script>標籤中的一次性數據括起來,並確保它們具有ID,使用jQuery或標準DOM方法訪問其內容。數據,你可以使用data-*屬性關鍵元素。

相關問題