我想访问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()
是否没有像这样的嵌套对象或其他问题?
答案 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
属性,就像另一个请求将呈现模板一样(显示覆盖的属性)。