无法将嵌套对象传递给res.render()?

时间:2013-12-06 05:57:18

标签: javascript node.js express pug

我想访问through jade传递的客户端javascript 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,
  }

然后我可以将其作为单个对象传递给客户端javascript。

script.
  var clientData = #{clientData}

但这不起作用。

res.render()是否没有像这样的嵌套对象或其他问题?

1 个答案:

答案 0 :(得分:4)

您无法使用#{...}呈现对象,因为它会对象进行字符串化(类似于:{}.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属性,就像另一个请求将呈现模板一样(显示覆盖的属性)。