【问题标题】:Can't pass a nested object to res.render()?不能将嵌套对象传递给 res.render()?
【发布时间】:2013-12-06 05:57:18
【问题描述】:

我想访问客户端 javascript 上的一个变量,through jade,通过 form the server (node) 传递。

所以我做了一个嵌套对象:

var clientData = 
  {clientData:{
    title: 'Title',
    body: "body",
    appadress: 'localhost' || req.host,
    socketport: socketport,
  } }

然后将此对象传递给jade (via res.render)..

app.get('/', function(req, res){
  clientData.clientData.appadress = req.host;
  res.render('index.jade', clientData)});

在翡翠中被视为..(我相信)

clientData:{
    title: 'Title',
    body: "body",
    appadress: 'localhost' || req.host,
    socketport: socketport,
  }

然后我可以将它作为 single 对象传递给客户端 javascript。

script.
  var clientData = #{clientData}

但这不起作用。

res.render() 不接受这样的嵌套对象或其他问题吗?

【问题讨论】:

    标签: javascript node.js express pug


    【解决方案1】:

    您不能使用#{...} 渲染对象,因为这会将对象字符串化(类似于:{}.toString(),生成[object Object])。

    相反,您需要先将变量转换为 JSON,并确保 Jade 不会转义输出:

    var clientData = !{ JSON.stringify(clientData) };
    

    编辑:这是一个简单的独立测试(但同样的原则也适用于通过 Express 使用 Jade):

    // app.jade
    var jade  = require('jade');
    
    jade.renderFile('test.jade', {
      filename  : 'test.jade', // These two properties are only for `renderFile`,
      pretty    : true,        // you don't need to include them with`res.render`
      clientData:{
        title     : 'Title',
        body      : 'body',
        appadress : 'localhost',
        socketport: 8888,
      }
    }, function(err, html) {
      if (err) throw err;
      console.log(html);
    });
    
    // test.jade
    !!!
    html
      head
        script.
          var clientData = !{ JSON.stringify(clientData) };
      body
        h1 Hello World
    
    // Output:
    <!DOCTYPE html>
    <html>
      <head>
        <script>var clientData = {"title":"Title","body":"body","appadress":"localhost","socketport":1234};</script>
      </head>
      <body>
        <h1>Hello World</h1>
      </body>
    </html>
    

    我只是注意到您似乎将clientData 用作共享变量,并且仅从每个请求中设置clientData.clientData.appadress。这将导致问题,因为clientData 变量在所有请求之间共享,并且一个请求可能会覆盖appaddress 属性,就像另一个请求将呈现模板一样(显示被覆盖的属性)。

    【讨论】:

    • 感谢您的洞察力。但我也无法让它工作。首先,使用!{} 它会给出一个“意外令牌.”错误。 (顺便说一句,这是做什么的?)所以我必须省略它clientData = JSON.stringify(clientData);。其次,即使在 JSON 化之后传递了变量,jade 中的简单 div= clientData 也不会输出任何内容。我能麻烦你发布一个更复杂的代码,还有玉端代码吗?
    • @laggingreflex 我更新了我的答案以举个例子(我也注意到你的代码中存在潜在的错误)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多