2

我正在使用 Nodejs 和 ExpressJS 。

我有一个 HTML 页面,其中有一个 Javascript 文件被引用。

<script type="text/javascript" src="../javascripts/game.js"></script>

我没有将所有的 Javascript 嵌入到 HTML 页面本身,因为它太大了。

现在我需要我的 Javascript (game.js) 来访问控制器传递的一些变量。我想做这样的事情-

var max_players = parseInt("<%= table.total_players %>");
console.log("<%= table.name %>")

我在渲染页面时传递了 table 变量。

 exports.index = function(req,res){

//code
res.render('mytable', {table: table });

    };

但这显然不起作用,因为 JS 文件被呈现为静态文件。如果我需要使这些变量可供 Javascript 访问,我该怎么办?

我在某处读到,这可以通过将 Game.js 重命名为 Game.ejs 来实现。但是我应该把 Game.js 文件放在哪里(以便正确和动态地呈现它?)

如果还有其他方法可以实现这一点,也请告诉我。

4

1 回答 1

8

可能最简单的选择是在之前的另一个中输出您需要的全局变量table(或table自身):<script>game.js

<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>

请注意<%- ... %>vs.的使用<%= ... %>,它将跳过对输出进行 HTML 编码,因为这可能会导致语法错误。

在这里使用JSON.stringify()利用了 JSON 和 JavaScript 之间的语法关系。这些值将在服务器端写入 JSON 数据,但在客户端解析为JavaScript 文字。


如果你想game.js通过 EJS 运行它自己,你可以将它移动到你的./views目录中,为它添加一个路由,然后res.render()它。

请注意,您需要将 设置Content-Type为假定值text/html,这可能会导致某些浏览器拒绝解析。

// ~/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 });
});

另一种选择是game.js请求table. 您可以在此帖子的先前编辑中看到此示例。

于 2013-08-24T00:48:46.683 回答