用nodejs服务dynamicJavaScript文件
问题
如何dynamic提供JavaScript文件? 具体来说,脚本保持其大部分的身体,但一些variables变化(想象HTML Jade模板,但这是纯JavaScript)。
脚本
当用户或浏览器(通常HTTP GET)访问/file.js
传递参数api
,例如/file.js?api=123456
,我想输出纯粹的JavaScript,我可以把123456
放在我的代码里面,dynamic。 内容types是application/javascript
。
样品:
var api = #{req.query.api}; //Pseudo //The rest of my javascripts template ...
从我的主要.js文件,我已经build立了路线:
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
不同而呈现。 我能想到的唯一可能的dynamic方式是使用Jade,但它不允许纯JavaScript模板。 我相信还有其他的解决办法。
请原谅我的解释。 问题有点像这样: 如何用Jade生成纯JavaScript文件
如果你想做一些快速和肮脏的事情,那么你可以做这样的事情(根据你的例子在评论中)。
App init – 读取.js 模板文件并caching它:
// 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密钥解决问题时,您可以join文件。
fileChunks[2] = '12345'; var responseData = fileChunks.join(''); res.write(responseData);
但是你最后访问的api键然后被保存在一个数组中。 不是很有前途的证据,但是如果你需要一些快速的东西,它就会起作用。