在Javascript逻辑中访问EJS变量

在Javascript逻辑中访问EJS变量,javascript,node.js,express,ejs,Javascript,Node.js,Express,Ejs,我正在开发Node.js应用程序(这是一个游戏)。在本例中,我设置了一些代码,当一个人访问索引并选择一个房间时,他会被重定向到正确的房间 现在,在Express v2.5.8中是这样做的: server.get("/room/:name/:roomId, function (req, res) { game = ~databaseLookup~ res.render("board", { gameState : game.gameState }); } 在board.ejs中,我可以通

我正在开发Node.js应用程序(这是一个游戏)。在本例中,我设置了一些代码,当一个人访问索引并选择一个房间时,他会被重定向到正确的房间

现在,在Express v2.5.8中是这样做的:

server.get("/room/:name/:roomId, function (req, res) {
  game = ~databaseLookup~
  res.render("board", { gameState : game.gameState });
}
在board.ejs中,我可以通过如下代码访问游戏状态:

<% if (gameState) { %>
  <h2>I have a game state!</h2>
<% } %>

我有一个游戏状态!
有没有办法将其导入JavaScript逻辑?我希望能够像
var gs=~import ejs gameState~
这样做,然后能够用它做任何我想做的事情——访问它的变量,将它打印到控制台进行验证。最终,我想用这个游戏状态来正确显示棋盘,要做到这一点,我需要访问棋子的位置,然后在屏幕上正确显示它们


谢谢

您可以直接将gameState变量注入页面上的javascript中

<% if (gameState) { %>
     <h2>I have a game state!</h2>
     <script>
        var clientGameState = <%= gameState %>            
     </script>
<% } %>

我有一个游戏状态!
var clientGameState=
另一个选项可能是在页面已经加载后向服务器回拨AJAX,返回gameState JSON,并将clientGameState设置为JSON响应


您可能也对此感兴趣:

我觉得下面的逻辑更好,而且对我很有用

假设传递到ejs页面的变量是
uid
,则传递该变量时,可以使用
div
标记或
h
标记的内容。您可以访问脚本中div或
h
标记的内容,并将其分配给变量

下面的代码示例:(在ejs中)


$(文档).ready(函数(){
var x=$(“#uid”).html();
警报(x);//现在JS变量“x”具有从节点后端传递的uid。
});

在这种情况下,您可以简单地使用输入文本来获取数据。当您在firebase中使用它时,它非常简单且经过测试

<input type="text" id="getID" style="display: none" value="<%=id%>">

我也有同样的问题。我需要在js脚本中使用数据,而不仅仅是渲染页面。因为页面在呈现时只是字符串,所以必须将数据转换为字符串,然后在js中再次解析。在我的例子中,我的数据是一个JSON数组,因此:

<script>
  var test = '<%- JSON.stringify(sampleJsonData) %>'; // test is now a valid js object
</script>

var测试=“”;//test现在是一个有效的js对象
单引号不能与stringify的双引号混合使用。同样来自ejs文档:

“在EJS模板中:
ex:-testing.ejs

<html>
<!-- content -->
<script>
    // stringify the data passed from router to ejs (within the EJS template only)
    var parsed_data = <%- JSON.stringify(data) %>  
</script>
</html>
在链接的js(或jquery)脚本文件中:
ex:-script.js 在JavaScript中:

console.log(parsed_data)
在JQuery中:

$(document).ready(function(){
    console.log(parsed_data)
 });
注: 1.用户-而不是标签中的=
2.您不能声明或使用从路由器传递的数据直接查看链接的javascript或jquery脚本文件。
3.仅在EJS模板中声明,并将其用于任何链接的脚本文件

我不确定,但我发现使用从路由器传递的数据在脚本文件或脚本标记中查看是最好的做法。

这对我很有用

// bar chart data
    var label = '<%- JSON.stringify(bowlers) %>';
    var dataset = '<%- JSON.stringify(data) %>';

    var barData = {
      labels: JSON.parse(label),
      datasets: JSON.parse(dataset)
    }
//条形图数据
var标签=“”;
var数据集=“”;
var barData={
标签:JSON.parse(标签),
数据集:JSON.parse(数据集)
}
这应该行得通

game = ~databaseLookup~
  res.render("board", { gameState : game.gameState });
在前端js中

'<%- JSON.stringify(gameState) %>'
“”

我决定在页面加载后使用AJAX调用。上面代码的问题是,它的计算结果为[object object],这根本不是我想要的。谢谢!我在所有页面的底部都使用了一些传递给它的标准内容,如请求对象、用户对象、表单错误。如果代码的计算结果为[object object],我建议使用
JSON.stringify(game.gameState)
服务器端。然后stringify对象将被放入脚本标记中。由于ejs呈现通常会转义HTML的特殊字符,因此您需要在脚本标记中使用
var clientGameState=
(以下是我是如何做到的:
res.render('test',{images:JSON.stringify(images)})
在服务器端,
var test=JSON.parse(“”)
在客户端。那么函数变量呢?它不能用上面的代码字符串化,当你查看源代码时,你可以很容易地看到整个UID对象。这不是正确的方法,即使它工作。单引号不工作,但模板文字工作。我相信这可能不安全,例如,
sampleJsonDa的内容ta
包含恶意字符串,它们很容易脱离脚本上下文。下面是一篇相关文章,介绍了Django模板语言中的一个并行场景:我不明白为什么它会包含恶意字符串?您不能控制字符串中的内容吗?页面在服务器端生成,并按原样发送到浏览器然后在那里解析。
game = ~databaseLookup~
  res.render("board", { gameState : game.gameState });
'<%- JSON.stringify(gameState) %>'