2016-12-03 112 views
1

我使用nodeexpress並且我希望服務器發送訪問對象。 例如如何訪問服務器在客戶端設置的對象

服務器端:

router.get('/some_page/', (req, res) => { 
    res.render('some_page', { 
     data: {"somevar1":"somevalue", "somevar2":"somevalue2"} 
    }); 
}); 

客戶端的JavaScript:

var objSentFromSrv = ??? // here i want this object and then perform some action on it 

這是可能的/合法的?

編輯:

我使用handlebars作爲模板引擎。

想出來了。

function middlewareAppendingLocals(req, res, next) { 
    res.locals.layoutV = myValue; 

    next(); 
} 

router.post('/page/', middlewareAppendingLocals, (req, res) => { 
    res.render('page_to_render'); 
}); 

在我的情況下,這個變量是從數據庫,我給它基於從antoher頁面張貼的ID。但是,我仍然可以如何從javascript訪問它,而不僅僅是形成.hbs佈局文件。

然後page_to_render有,我可以handlebars {{}}來獲取它。

+0

你應該注意你正在使用的模板語言 –

回答

0

如果您正在使用AngularJS作爲您的前端服務,您可以創建一個控制器並讓其注入$scope$http以獲取數據。例如:

var app = angular.module('myApp', []); 

    app.controller('mainController', ($scope, $http) => { 
    $scope.data= {}; 

    $scope.getData = function() { 
     $http.get('/some_route/') 
      .success((data) => { 
       $scope.data = data; 
       console.log(data); 
      }) 
      .error((error) => { 
       console.log(error); 
      }); 
    }; 
}); 

然後在前端,撥打getData()

https://docs.angularjs.org/guide/controller

+0

除了expressjs之外,我沒有使用AngularJS或任何其他框架。 – voodoo16

0

你的模板引擎要帶傳遞給渲染調用的參數併產生HTML(經常)或JSON。這不是真的發送對象,只是文本數據。

如果您希望更改服務器端存在的某個對象的狀態,則需要創建某種API來完成此操作。將數據發送到客戶端,對該數據進行更改,然後將其發送回服務器以合併到原始對象中。

+0

我只想在客戶端做一些事情,而不需要發回對象。那麼我怎麼能用'handlebars'來訪問它呢?我的意思是在客戶端有一些邏輯在對象上做事,不僅通過{{}}呈現它。 – voodoo16

+0

如果您可以展示原始對象的示例,並且在它到達客戶端後想要使用它,那將會很有幫助 –

+0

我的主要目標是呈現保存的模板。模板包含:行,列,大小行的數組乘以列,表示某些數據。現在我想以一些不錯的方式呈現該數組。我知道'hbs'中我可以{{each ...},但這就像2D數組,我想放置行和列。所以我正在縮小模運算來選擇它是行還是列。 – voodoo16

1

您需要將對象編碼爲JSON是這樣的:

router.get('/some_page/', (req, res) => { 
    res.send(JSON.stringify({ 
     data: {"somevar1":"somevalue", "somevar2":"somevalue2"} 
    })); 
}); 

,然後在前端使用AJAX,使用jQuery你可以使用

$.get('/some_page/', function(data) { 
    var objSentFromSrv = JSON.parse(data); 
}); 

或更短:

$.getJSON('/some_page/', function(data) { 
    var objSentFromSrv = data; 
}); 
+0

它不是發送兩次數據嗎?首先當您在瀏覽器中輸入URL時,第二次腳本開始執行時? – voodoo16

+0

你的帶腳本的html頁面不應該是'/ some_page /'它只是用於返回JSON。 – jcubic

+0

這是不正確的。快速路由並不表示返回類型是什麼,但通常是HTML。 「數據」對象是傳遞給模板的內容。 –

1

是的。這是可能的和合法的。假設你正在使用EJS,加上這樣一行到您的模板:

<script> 
    const objSentFromSrv = <%-JSON.stringify(data)%>; 
</script> 

如果您使用的是不同的模板引擎,你只需要查看關於如何序列化對象的特定語法。

對於這種使用情況,Ajax是矯枉過正的。

相關問題