在jade模板文件(index.jade)中声明的变量(config)没有传递给javascript文件时遇到了问题,这会使我的javascript崩溃。下面是文件(views/index.jade):
h1 #{title}
script(src='./socket.io/socket.io.js')
script(type='text/javascript')
var config = {};
config.address = '#{address}';
config.port = '#{port}';
script(src='./javascripts/app.js')
下面是我的app.js (服务器端)的一部分:
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.set('address', 'localhost');
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// Routes
app.get('/', function(req, res){
res.render('index', {
address: app.settings.address,
port: app.settings.port
});
});
if (!module.parent) {
app.listen(app.settings.port);
console.log("Server listening on port %d",
app.settings.port);
}
// Start my Socket.io app and pass in the socket
require('./socketapp').start(io.listen(app));
下面是我的javascript文件崩溃的一部分(public/javascripts/app.js):
(function() {
var socket = new io.Socket(config.address, {port: config.port, rememberTransport: false});
我在本地主机(我自己的机器)上以开发模式(NODE_ENV=development)运行站点。我使用node-inspector进行调试,它告诉我在public/javascripts/app.js中没有定义config变量。
有什么想法吗?谢谢!!
发布于 2018-05-12 10:57:04
在我的例子中,我试图通过快速路由将一个对象传递到模板中(类似于操作设置)。然后,我希望将该对象传递给一个函数,该函数是通过pug模板中的脚本标记调用的。尽管lagginreflex's answer让我离得很近,但我最终得到了以下结果:
script.
var data = JSON.parse('!{JSON.stringify(routeObj)}');
funcName(data)
这确保了对象按预期传入,而不是需要在函数中反序列化。此外,其他答案似乎也适用于原语,但当数组等与对象一起传递时,它们被解析为字符串值。
发布于 2018-09-05 20:51:31
如果您像我一样经常使用这种传递变量的方法,那么这里有一个编写更少代码的解决方案。
在node.js路径中,在名为window
的对象中传递变量,如下所示:
router.get('/', function (req, res, next) {
res.render('index', {
window: {
instance: instance
}
});
});
然后在您的pug/jade布局文件中(就在block content
之前),像这样将它们取出:
if window
each object, key in window
script.
window.!{key} = !{JSON.stringify(object)};
因为每个pug文件都加载了我的layout.pug文件,所以我不需要一遍又一遍地“导入”我的变量。
这样,传递给window
的所有变量/对象都会“神奇”地在浏览器的真正window
对象中结束,您可以在Reactjs、Angular等应用程序中使用它们。或者vanilla javascript。
发布于 2012-01-04 02:27:57
请看这个问题:JADE + EXPRESS: Iterating over object in inline JS code (client-side)?
我也有同样的问题。Jade不会将本地变量传递给javascript脚本(或者根本不做任何模板操作),它只是将整个代码块作为文字文本传递。如果您在Jade文件中的script标记上方使用了本地变量'address‘和'port’,它们应该会显示出来。
我在上面链接的问题中列出了可能的解决方案,但您可以:-将每行作为未转义的文本传递(!=在每行的开头),并简单地将"-“放在使用局部变量的javascript的每一行之前,或者:-通过dom元素传递变量并通过JQuery访问(丑陋)
没有更好的方法了吗?Jade的创建者似乎不想要多行javascript支持,如GitHub:https://github.com/visionmedia/jade/pull/405中的线程所示
https://stackoverflow.com/questions/8698534
复制相似问题