在Javascript逻辑中访问EJS变量

Cat*_*ang 34 javascript ejs node.js express

我正在研究NodeJS应用程序(这是一款游戏).在这种情况下,我设置了一些代码,以便当一个人访问索引并选择一个房间时,他会被重定向到适当的房间.

现在它正在这样做,使用Express v2.5.8:

server.get("/room/:name/:roomId, function (req, res) {
  game = ~databaseLookup~
  res.render("board", { gameState : game.gameState });
}
Run Code Online (Sandbox Code Playgroud)

在board.ejs中,我可以使用以下代码访问gameState方式:

<% if (gameState) { %>
  <h2>I have a game state!</h2>
<% } %>
Run Code Online (Sandbox Code Playgroud)

有没有办法将它导入我的JavaScript逻辑?我希望能够做类似var gs = ~import ejs gameState~的事情

然后能够用它做任何我想做的事情 - 访问它的变量,将其打印到控制台进行验证.最终我想用这个gameState做的是正确地显示板子,为此我需要做一些事情,比如访问片段的位置,然后在屏幕上正确显示它们.

谢谢!

Nic*_*nis 47

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

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

另一个选项可能是在页面加载后向服务器发出AJAX调用,返回gameState JSON,并将clientGameState设置为JSON响应.

您可能也对此感兴趣:如何在Node.js和浏览器之间共享代码?

  • 如果代码求值为[object Object],我建议使用`JSON.stringify(game.gameState)`服务器端.然后,字符串化的对象将被放入脚本标记中.由于ejs渲染通常会转义HTML的特殊字符,因此您需要在脚本标记内使用`var clientGameState = <% - gameState%>`(而不是`<%=`)如果需要gameState来呈现页面同样,你可以做一个JSON.parse()来循环它等. (12认同)
  • 在@Matthias之后我就是这样做的:```res`render('test',{images:JSON.stringify(images)})````服务器端,```var test = JSON.parse('< % - images%>');```在客户端. (2认同)

Aro*_*yan 17

我有同样的问题。我不仅需要将数据用于渲染页面,还需要在我的 js 脚本中使用。因为页面在渲染的时候只是字符串,所以必须把数据转成字符串,然后在js中再次解析。在我的情况下,我的数据是一个 JSON 数组,所以:

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

单引号不能与 stringify 的双引号混合使用。同样来自 ejs 文档:

"<%- 将未转义的值输出到模板中"

对数组也可以这样做。只需连接数组然后再次拆分。


kar*_*agi 10

在 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>
Run Code Online (Sandbox Code Playgroud)

在服务器端脚本中:
例如:Router.js

res.render('/testing', {
    data: data // any data to be passed to ejs template
});
Run Code Online (Sandbox Code Playgroud)

在链接的 js(或 jquery)脚本文件中:
ex:- script.js 在 JavaScript 中:

console.log(parsed_data)
Run Code Online (Sandbox Code Playgroud)

在 JQuery 中:

$(document).ready(function(){
    console.log(parsed_data)
 });
Run Code Online (Sandbox Code Playgroud)

注意: 1. user - 而不是 <% %> 标记中的 =
2. 您不能声明或使用从路由器传递的数据直接查看链接的 javascript 或 jquery 脚本文件。
3. 仅在 EJS 模板中声明 <% %> 并在任何链接的脚本文件中使用它。

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


小智 7

我觉得下面的逻辑更好,它对我有用.

假设传递给ejs页面的变量是uid,您可以拥有div标记的内容或h传递变量的标记.您可以h在脚本中访问div或标记的内容并将其分配给变量.

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

<script type="text/javascript">
    $(document).ready(function() {
        var x = $("#uid").html(); 
        alert(x);  // now JS variable 'x' has the uid that's passed from the node backend.
    });
</script>

<h2 style="display:none;" id="uid"><%=uid %></h2>
Run Code Online (Sandbox Code Playgroud)

  • 使用上面的代码,您可以在查看源代码时轻松查看整个UID对象.即使它有效,这也不是正确的方法 (2认同)