簡體   English   中英

Express/Node.js:將自定義 javascript 作為響應呈現

[英]Express/Node.js : Render custom javascript as response

在我的應用程序中,我需要提供一個 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!

您應該查看下划線模板 我認為,為了生成任意文本輸出,它會更清潔。 Jade專門用於呈現HTML。

你也可以試試MustacheHandlebars

根據您的評論,我發現您希望繼續使用res.render來呈現模板。 consolodate.js為Express增加了對所有主要模板引擎的支持。 包括@TheHippo提到的Underscore模板,Handlebars,Moustache和Dust。

您可以嘗試在模板外部的單獨模塊中定義需要發送到瀏覽器的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模塊中並將它們作為普通腳本文件加載?

您可以使用https://www.npmjs.com/package/rendercustomjs包,它工作正常,但在 ejs 模板中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM