Express / Node.js:将自定义javascript渲染为响应

时间:2013-05-06 22:49:41

标签: javascript node.js express response pug

在我的应用程序中,我需要提供一个API(类似Google Maps javascript API),通过它我可以发送一些自定义的javascript(带有一些会话和请求相关信息)作为响应。然后使用javascript在UI上绘制一些图形。我正在使用Express with Jade作为我的模板引擎。我目前使用的代码是:

app.use('/graph',function(req, res){
   //send out graph data
   var var_name = req.session.var_name //fetch something from session
   var graphData = fetchGraphData(req.query.graph); //function that fetches graph data
   res.contentType("text/javascript");
   res.render(__dirname + '/views/graph.jade', {
     title: "Title", queryStr: JSON.stringify({var_name: var_name, graphData: graphData  })
   });
});

和玉文件:

|  some_var_name = {
|       initGraph : function(divId){
|       //some code here
|       var graphData = !{graphData}
|       // do something                               

作为一种解决方法,我使用|启动了jade文件的每一行,以便jade将文本解析为纯文本,并且不添加任何html标记!它工作正常,但是有更清洁的方法吗?解决方案可能会也可能不会使用Jade!

2 个答案:

答案 0 :(得分:6)

你应该研究underscore templates。我认为,为了生成任意文本输出,它会更清洁。 Jade专门用于呈现HTML。

您还可以尝试MustacheHandlebars

根据您的评论,我发现您希望继续使用res.render来呈现模板。 consolodate.js为Express增加了对所有主要模板引擎的支持。包括@TheHippo提到的Underscore模板,Handlebars,Moustache和Dust。

答案 1 :(得分:1)

您可以尝试定义需要在模板外部的单独模块中发送到浏览器的JavaScript函数,从“关注点分离”的角度来看,这可能是更正确的方法。此外,如果功能在单独的模块中定义,则可以在服务器和浏览器中使用它们。

然后你可以在调用模板的函数中或者在模板内部使用toString()方法将函数转换为字符串,如果它支持纯JavaScript,那就是下划线,EJS和doT模板的情况(我试过了)下划线和EJS最终都使用了doT,这不仅是最快的,而且非常通用 - 请查看它:

JS代码:

// if you send the same functions you may want to convert them to strings in advance
var data = {
    funcStr: func.toString();
};
res.render(view, data);

模板(doT):

<script type="text/javascript">
    func = {{= it.funcStr }};

    // now you can call it here if you want but I would use 
    // separate JavaScript files
    func();
</script>

我用它将预先编译的模板与第一页加载的页面一起发送到浏览器,但我认为它也可以在你的情况下使用。

作为一个附带问题,为什么不能将所有这些函数捆绑在一个单独的JavaScript模块中并将它们作为普通脚本文件加载?