Express/Node.js:将自定义javascript呈现为响应

Express/Node.js:将自定义javascript呈现为响应,javascript,node.js,express,response,pug,Javascript,Node.js,Express,Response,Pug,在我的应用程序中,我需要提供一个API(类似于Google Maps javascript API),通过它我可以发送一些定制javascript(带有一些会话和请求相关信息)作为响应。然后使用javascript在UI上绘制一些图形。我正在使用带有Jade的Express作为我的模板引擎。我当前使用的代码是: app.use('/graph',function(req, res){ //send out graph data var var_name = req.session.v

在我的应用程序中,我需要提供一个API(类似于Google Maps javascript API),通过它我可以发送一些定制javascript(带有一些会话和请求相关信息)作为响应。然后使用javascript在UI上绘制一些图形。我正在使用带有Jade的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                               
作为一种解决方法,我用
|
开始jade文件的每一行,这样jade就可以将文本解析为纯文本,而不添加任何html标记!它工作得很好,但是有没有更干净的方法呢?该解决方案可能使用翡翠,也可能不使用翡翠

你应该调查一下。我认为,对于生成任意文本输出,它会更干净一些。Jade是专门为呈现HTML而构建的

你也可以试试看


根据您的评论,我发现您希望继续使用
res.render
来呈现模板。添加对所有要表达的主要模板引擎的支持。包括@TheHippo提到的下划线模板、把手、胡子和灰尘。

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

然后,您可以使用其toString()方法将函数转换为字符串,方法可以是在调用模板的函数中,也可以是在模板内部,如果它支持纯JavaScript(下划线、EJS和点模板就是这种情况)(我尝试了下划线和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):


func={{=it.funcStr}};
//如果你愿意,现在你可以在这里叫它,但我会用
//单独的JavaScript文件
func();
我使用它将预编译的模板与第一次加载页面时的页面一起发送到浏览器,但我认为它也可以用于您的情况


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

我不知道实际需要多少模板,但您仍然可以使用
res.send
发送您想要的任何字符串。@TheHippo:谢谢您的响应!但我想组织响应数据在文件中,会有很多这样的操作,而且文件也很长!也应该可以正常工作,因为它与语言无关。(不仅仅是HTML模板)感谢您的输入。我使用了Handlebar。现在看起来更干净了!我公开的API在一些基本HTTP身份验证之后只返回一个javascript文件,js响应包含一些身份验证信息和一些与socket.io交互的请求参数。js响应类似于google maps API。响应只能是1个js文件,因此我不能将函数捆绑在一个单独的文件中,除非在呈现响应之前将所有单独的文件编译成一个!
<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>