如何在静态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 。 你可以在之前的这篇文章中看到这个例子。