Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用nodejs提供动态javascript文件_Javascript_Node.js_Templates_Express_Pug - Fatal编程技术网

使用nodejs提供动态javascript文件

使用nodejs提供动态javascript文件,javascript,node.js,templates,express,pug,Javascript,Node.js,Templates,Express,Pug,问题 如何动态地为javascript文件提供服务?具体来说,脚本保留了大部分主体,但有些变量是可更改的(想象一下HTML Jade模板,但这是纯javascript) 场景 当用户或浏览器(http GET一般)访问/file.js传递参数api,例如/file.js?api=123456,我想输出纯javascript,在那里我可以动态地将123456放入我的代码中。内容类型为application/javascript 样本: var api = #{req.query.api}; //P

问题

如何动态地为javascript文件提供服务?具体来说,脚本保留了大部分主体,但有些变量是可更改的(想象一下HTML Jade模板,但这是纯javascript)

场景

当用户或浏览器(http GET一般)访问
/file.js
传递参数
api
,例如
/file.js?api=123456
,我想输出纯javascript,在那里我可以动态地将
123456
放入我的代码中。内容类型为
application/javascript

样本:

var api = #{req.query.api}; //Pseudo
//The rest of my javascripts template
...
在我的main.js文件中,我设置了路线:

app.get( '/file.js', function( req, res ) {

    //Pseudo code that I would like to achieve
    var name = req.query.name;
    res.render( 'out_put_javascript_file_from_jade_file.jade', { name: name } );

});
因此,当一个人访问
/file.js
时,脚本文件将根据URL中传递的参数
api
以不同的方式呈现。我能想到的唯一可能的动态方式是使用Jade,但它不允许使用纯javascript模板。我认为必须有其他解决办法


请原谅我的解释。问题有点像这样:

如果你想做一些快速而肮脏的事情,那么你可以做类似的事情(基于你在评论中的例子)

App init-读取.js模板文件并将其缓存:

// this should be async, but hey, not teaching you that part here yet
var fileJs = fs.readFileSync('file.js.template');
File.js:

(function() {
  $(window).on('load', function() {
    alert('Your api key is API_KEY_CONST');
  });
})();
请求:

GET /api/file.js?key=123
路由器:

app.get('/api/file.js', function(req, res) {

    var key = req.query.key;
    var key = fetchKeyFromDBSync(); // just to make it easier here, no async.
    var out = fileJs.replace(API_KEY_CONST, key);

    res.setHeader('content-type', 'text/javascript');
    res.write(out);
    res.end();
});
现在,这真的很愚蠢,你不应该在家里尝试,但它只是演示了如何做你想要的

编辑:

根据文件长度,如果将文件的块放入数组中,可能会执行得更好,如:

var fileChunks = ['(function(){ blablabla;', 'var myAPIKey=', 'KEY_PLACEHOLDER', '; alert (myAPIKey);', '})()']
因此,稍后当您使用真正的API密钥解析它时,您将加入该文件

fileChunks[2] = '12345';
var responseData = fileChunks.join('');
res.write(responseData);

但最后访问的api密钥将保存在一个数组中。不太适合未来,但如果您需要一些快速的东西,它应该可以工作。

Mmm,动态生成JS有点危险?为什么需要这样的功能?您可以调用
my_common.js
并在您的JADE模板中生成内联js。此内联JS将是唯一更改的JS。但如果没有更多信息,很难给出建议:)我正在编写一个小的API片段,但它需要从javascript文件中的数据库生成API密钥。使用PHP非常简单,但是我还有很多关于NodeJ的知识要学习。您可以这样描述:用户访问
http://example.com/file.js?api=123
,浏览器返回
application/javascript
,并显示以下代码
警报(“您的API密钥是123”)。任何方法都应该管用,但我有限的知识并没有带来足够好的结果。请告知。Jade是HTML的模板引擎。你试图解释什么是没有意义的。为什么需要生成JS文件?您真的不想生成
警报()
?那么,请告诉我们您希望对生成的输出执行什么操作?谁来处理/正在处理它?Jade正是我想到的,因为我没有其他解决方案。我相信有更好的解决办法<代码>警报()
仅为伪代码。我希望在访问某个路由时,例如,
/file.js?api=123
,浏览器将输出纯javascript代码,并动态生成该代码的一部分。伪:http.get
/file.js?api=123
将生成
api=123;用api()做点什么
或http.get
file.js?api=456
将生成
api=456;用api()做点什么。哇!这是相当快,确实肮脏lol。但它真的为我所要求的工作!我有一个简单的问题,
fileJS.replace()
真的是
String.prototype.replace
?我只是想知道如何正确使用它!而且,一点也不傻。我不想在家里尝试。如果没有可行的解决方案,我会把它投入生产。我在这里没有看到任何安全问题。是的,fileJS.replace是在readFileSync的结果上这样做的(它会返回文件的内容,因此如果它是二进制文件…),无论如何,理想情况下,您应该延迟加载这些文件,并在它们准备好之前(可能是服务器启动后的几毫秒)。您也可以这样做:以流的形式读取文件内容,并生成一个转换流,将其置于请求和响应之间。只要它看不到常量(CAPS),Transformer就会将数据输出到res。当它运行到caps时,它暂停写入和缓冲输入,直到读取并替换常量,然后输出。第一种方法只缓存文件内容一次。流每次都读取文件。取决于你需要什么。我怀疑为什么这是一种愚蠢的做事方式?也许这是不安全的,但我想不出除了URL欺骗以外的任何东西。服务器端验证不能消除任何类型的攻击吗?嗯,它感觉很难闻,我相信有更好的方法。至于安全问题,我甚至没有提到这方面。你有没有具体的问题?