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

Javascript 无法将嵌套对象传递给res.render()?,javascript,node.js,express,pug,Javascript,Node.js,Express,Pug,我想访问客户端javascript上传递的变量 因此,我创建了一个嵌套对象: var clientData = {clientData:{ title: 'Title', body: "body", appadress: 'localhost' || req.host, socketport: socketport, } } 然后把这个东西递给杰德 在玉器中被视为。。我相信 clientData:{ title: 'Title', bo

我想访问客户端javascript上传递的变量

因此,我创建了一个嵌套对象:

var clientData = 
  {clientData:{
    title: 'Title',
    body: "body",
    appadress: 'localhost' || req.host,
    socketport: socketport,
  } }
然后把这个东西递给杰德

在玉器中被视为。。我相信

clientData:{
    title: 'Title',
    body: "body",
    appadress: 'localhost' || req.host,
    socketport: socketport,
  }
然后我可以将其作为单个对象传递给客户端javascript

但这不起作用


res.render是否不接受这样的嵌套对象或其他问题

不能使用{…}渲染对象,因为这会使对象字符串化,类似于:{}.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.AppAddress。这将导致问题,因为clientData变量在所有请求中共享,并且一个请求可能会覆盖appaddress属性,就像另一个请求将呈现显示被覆盖属性的模板一样。

您不能使用{…}呈现对象,因为这样会使对象字符串化,类似于:{}.toString,这将产生[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.AppAddress。这将导致问题,因为clientData变量在所有请求中共享,并且一个请求可能会覆盖appaddress属性,就像另一个请求将呈现显示被覆盖属性的模板一样。

感谢您的帮助。但是我也不能让它工作。。首先,用!{}它给出了一个“意外标记”。错误。顺便说一句,这有什么用?所以我必须省略它clientData=JSON.stringifyclientData;。其次,即使在jsonification之后传递变量,jade中的简单div=clientData也不会输出任何内容。我可以麻烦你发布一个更完整的代码,还有玉边的代码吗?@laggingreflect我更新了我的答案,给出了一个例子,我注意到你的代码中有一个潜在的错误,tooThanks for the insight。但是我也不能让它工作。。首先,用!{}它给出了一个“意外标记”。错误。顺便说一句,这有什么用?所以我必须省略它clientData=JSON.stringifyclientData;。其次,即使在jsonification之后传递变量,jade中的简单div=clientData也不会输出任何内容。我可以麻烦你发布一个更完整的代码,还有玉边代码吗?@laggingreflect我更新了我的答案,给出了一个例子,我注意到你的代码中也有一个潜在的错误