Express / Node.js:渲染自定义JavaScript作为响应

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

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 

作为一个解决方法,我已经用|开始每一行玉文件 ,这样玉才能将文本parsing为纯文本,而不会添加任何html标签! 它工作正常,但有没有更干净的方法来做到这一点? 解决scheme可能会或可能不会使用Jade!

你应该看看下划线模板 。 我认为,为了产生任意的文本输出,它会更清洁。 Jade专门用于呈现HTML。

你也可以尝试胡子或把手 。

基于你的评论,我看到你想继续使用res.render渲染模板。 consolodate.js增加了对Express的所有主要模板引擎的支持。 包括由@TheHippo提到的下划线模板,把手,小胡子和灰尘。

您可以尝试在模板之外的单独模块中定义需要发送到浏览器的JavaScript函数,这可能是“关注分离”的观点。 同样,如果函数是在一个单独的模块中定义的,它们可以在服务器和浏览器中使用。

然后你可以使用它的toString()方法将函数转换成string,如果它支持普通的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模块中,并将它们作为普通的脚本文件加载?