如何在静态JavaScript中embeddedEJS代码?
我正在使用Nodejs和ExpressJS。
我有一个HTML页面,其中有一个JavaScript文件被引用。
<script type="text/javascript" src="../javascripts/game.js"></script>
我没有将所有的JavascriptembeddedHTML页面本身,因为它太大了。
现在我需要我的Javascript(game.js)来访问控制器传递的一些variables。 我想要做这样的事情 –
var max_players = parseInt("<%= table.total_players %>"); console.log("<%= table.name %>")
我正在渲染页面时传递表variables。
exports.index = function(req,res){ //code res.render('mytable', {table: table }); };
但是,这显然不工作,因为JS文件被呈现为一个静态文件。 如果我需要使这些variables可以被Javascript访问,我该如何去做?
我从某个地方读到,可以通过将Game.js重命名为Game.ejs来实现。 但是我在哪里把Game.js文件(以便它的呈现正确和dynamic?)
如果还有其他方法可以达到这个目的,请告诉我。
也许最简单的select是在game.js
输出你需要的table
(或table
本身)在另一个<script>
的全局variables:
<script> var max_players = <%- JSON.stringify(table.total_players) %>; console.log(<%- JSON.stringify(table.name) %>); /* Alternative: var table = <%- JSON.stringify(table) %>; var max_players = table.total_players; console.log(table.name); */ </script> <script type="text/javascript" src="../javascripts/game.js"></script>
请注意使用<%- ... %>
与<%= ... %>
,这会跳过对输出进行HTML编码,因为这可能会导致语法错误。
在这里使用JSON.stringify()
利用了JSON和JavaScript之间的语法关系。 这些值将被写为服务器端的JSON数据,但是被parsing为JavaScript文字客户端。
如果你想通过EJS运行game.js
,你可以把它移动到你的./views
目录下,为它添加一个路由,然后res.render()
。
请注意,您需要将Content-Type
设置为假定值为text/html
,这可能会导致一些浏览器拒绝parsing。
// ~/views/game-js.ejs var max_players = <%- JSON.stringify(table.total_players) %>; console.log(<%- JSON.stringify(table.name) %>); // ...
app.get('/javascripts/game.js', function (req, res) { // code res.setHeader('Content-Type', 'application/javascript'); res.render('game-js', { table: table }); });
另一个select是让game.js
提出请求table
。 你可以在之前的这篇文章中看到这个例子。