簡體   English   中英

在node / express + ejs中將對象傳遞給客戶端?

[英]Passing an object to client in node/express + ejs?

我有一個很大的對象,需要將其傳遞給客戶端腳本中的函數。 我嘗試使用JSON.stringify,但是這種方法遇到了一些問題-主要與性能有關。 是否可以在ejs中執行類似的操作?

app.get('/load', function(req, res) {
    var data = {
        layout:'interview/load',
        locals: {
            interview: '',
            data: someLargeObj
        }
    };
    res.render('load', data);
});

在我的客戶端腳本中,我會將這個對象傳遞給類似這樣的函數

<script type="text/javascript">
    load(<%- data %>); // load is a function in a client script
</script>

當我嘗試這個我得到

<script type="text/javascript">
    load();
</script>

要么

<script type="text/javascript">
    load([Object object]);
</script>

在Node.js中:

res.render('mytemplate', {data: myobject});

在EJS中:

<script type='text/javascript'>
  var rows =<%-JSON.stringify(data)%>
</script>

安全說明 :請勿使用它來渲染具有用戶提供的數據的對象。 Little Bobby Tables這樣的人可能會包含一個破壞JSON字符串並啟動可執行標簽等的子字符串。 例如,在Node.js中,這看起來很無辜。

var data = {"color": client.favorite_color}

但是如果用戶輸入的顏色如下,可能會導致在用戶的瀏覽器中執行客戶端提供的腳本:

"titanium </script><script>alert('pwnd!')</script> oxide"

如果您需要包括用戶提供的內容,請參見https://stackoverflow.com/a/37920555/645715 ,以獲得使用Base64編碼的更好答案

那是預期的行為。 您的模板引擎正在嘗試從您的對象創建一個字符串,該字符串導致[Object object]。 如果您真的想要傳遞這樣的數據,我認為您通過對對象進行字符串化來做正確的事情。

如果使用模板,則最好在模板中獲取值,例如,是否登錄用戶。 您可以使用以下方式獲取發送本地數據

<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>

從服務器端代碼,您正在發送用戶數據。

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});

認為將對象傳遞給ejs時有更好的方法,您不必處理JSON.stringfy和JSON.parse方法,這些方法有些棘手和令人困惑。 相反,您可以使用for in循環來移動對象的鍵,例如:

如果您有一個像這樣的層次結構的對象

{
    "index": {
        "url": "/",
        "path_to_layout": "views/index.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "default"
            }
        ]
    },
    "home": {
        "url": "/home",
        "path_to_layout": "views/home/index.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "home"
            }
        ]
    },
    "about": {
        "url": "/about",
        "path_to_layout": "views/default.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "about"
            }
        ]
    }
}

在EJS端,您可以像這樣循環yourObject;

<% if ( locals.yourObject) { %>
  <% for(key in yourObject) { %>
    <% if(yourObject.hasOwnProperty(key)) { %>
      <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div>
    <% } %>
  <% } %>
<% } %>

在此示例中,[key]可以采用“ index”,“ home”和“ about”值,並且子項可以是其任何子級,例如“ url”,“ path_to_layout”,“ path_to_data”

您所擁有的是這樣的結果[{'re':'tg'}]

您實際上需要循環它。 請參閱javascript while循環https://www.w3schools.com/js/js_loop_while.asp

然后,用ejs在您的前端呈現它...我對此無能為力,我使用hbs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM