2016-07-23 139 views
0

讓我先說我花了大量的時間試圖找出解決這個問題的方法,但我還沒有發現有效的東西。我正在使用節點,並希望在我的app.js服務器文件和客戶端JavaScript文件(demo.js)之間共享一個變量。在節點中的客戶端和服務器之間共享變量

我運行node app.js來啓動服務器,demo.js在客戶端運行。我試過使用module.exportsexport,但是當我嘗試導入demo.js文件或參考module.exports var時,我收到錯誤。也許我正在接近這是錯誤的方式。

例如,我正在嘗試使用節點wikipedia包來抓取數據。我在我的app.js文件中的以下內容:

var wikipedia = require('node-wikipedia'); 

wikipedia.page.data('Clifford_Brown', { content: true }, function(response) { 
    console.log(response); 
    export const response = response; 
    module.exports.data = response 
}); 

在我demo.js文件我已經嘗試導入此響應var和使用module.exports無功但我一直不成功。

任何人都可以解決這個問題或採取不同的方法?

+0

我不知道node.js技術的當前狀態,但我認爲期望在客戶端和服務器之間實現這種神奇的數據共享是不合理的。我期望的解決方案是通過電線明確發送數據。使用良好的舊請求響應(客戶端請求帶有ajax請求的數據並獲取響應中的數據)或服務器將數據推入websocket或其他東西。 –

回答

2

瀏覽器JavaScript文件在瀏覽器中運行。 node.js javascript文件在服務器上運行。你不能直接將東西從一個導出到另一個。他們位於不同地點的完全不同的計算機上。

對於開發人員來說,理解服務器端代碼在服務器上運行而客戶端代碼在瀏覽器上運行這一觀點非常重要。二者不能直接相互呼叫或達到其他變量。想象一下你的服務器在西雅圖的一個數據中心,瀏覽器在威尼斯的一臺電腦上運行。

請參閱How to access session variables in the browser您的各種選擇描述爲以前的答案。

簡而言之,您可以讓服務器在生成的網頁中插入一個javascript變量,以便當JavaScript在瀏覽器的網頁上運行時,它可以在其自己的頁面中訪問該變量。或者,您可以創建Ajax調用,以便客戶端可以直接從服務器請求數據。或者,您可以讓服務器將一些數據放入Cookie中,然後瀏覽器中的Javascript可以訪問這些數據。

如果服務器在生成頁面時很容易知道數據,並且您正在使用某種類型的頁面模板系統,那麼只需將<script>標記添加到生成的頁面即可,非常容易,該頁面定義了一個或包含所需信息的更多Javascript變量。然後,客戶端Javascript可以引用這些變量來訪問數據。

+0

您是否建議我將包含的app.js代碼移動到腳本標記中而不是?當我這樣做時,它告訴我需要的是undefined – chackerian

+0

@chackerian - 不,我建議當您爲瀏覽器請求生成網頁時,您在該網頁中嵌入了一些包含您正在嘗試的信息的'

0

他們是完全不同的系統。完成你想要做什麼,最好的辦法是通過字符串化數據

<script> var my_data = <%= JSON.stringify(data) %> </script> 

使用EJS那是一個例子,在expressjs一個共同的模板語言的創建在服務器端的HTML變量

+0

我很困惑。這個數據var會在我的情況下。 – chackerian

1

要在http中傳遞數據,有一個請求消息和響應消息,並且數據需要位於該消息中。

在請求中,可以傳遞變量請求URL

http://host_name/path?key=value

或者請求頭部和主體內。

在響應你傳回的響應報頭或響應主體

第一實例變量:

處理來自瀏覽器的URL請求的

一種方式明確而傳遞變量是你的服務器設置爲使用嵌入的變量呈現html頁面。

如果您使用像jade這樣的模板引擎,則可以使用res.render({ key: 'value' })直接將發送的變量消費到模板中,而不是使用基於承諾的api調用,這將在用戶在客戶端上執行某些操作時運行。

例如,

// SERVER setup rendering engine 
app.get('/', function(req, res) { 
    res.render('index', { key: 'value' }) 
} 

這會使index.html到客戶端傳遞到使用服務了的index.html(例如玉石或EJS)模板文件中的鍵值對。

第二個例子:

使用Axios公司可以成立一個行動調用服務器API(你也可以傳遞變量在URL,標題或正文)。使用承諾模式,您可以在服務器api響應後使用這些變量。

// CLIENT setup axios 
axios.get(URL + '/getkeyvalue') 
    .then(function(response) { 
     const value = response.data.key 
    }) 

在使用你的服務器表現你(這是你會得到了上述可選的請求變量)回送響應變量在身體這個樣子。

// SERVER setup express 
app.get('/getkeyvalue', function(req, res) { 
    res.send({ key: 'value' }) 
} 

注意,這些都是簡單的例子。

+1

「之後連接關閉」 - 這是不正確的。 –

+0

已澄清的最新答案。 – alexi2

+1

仍然不正確。你有沒有聽說過持續連接? –

相關問題