Node/Express将路由变量传递给JavaScript

3

我正在尝试传递一个对象到路由中,例如:

res.render('index', {myObj: myObj});

但是如果我想在首页运行JS脚本,该如何在脚本中访问这个对象呢?我查了一下发现可以使用ejs将其放入脚本中,例如:

var obj = "<%= myObj %>"

但是我不能把脚本放在一个独立的文件中,因为它依赖于ejs。
有什么正确的方法可以将这个参数传递给我的JS,以便我也可以把我的脚本放在一个独立的脚本文件中吗?
谢谢。

1
所以,我一直在做的是,在所有脚本之上定义常量,然后只需在从其他文件加载的脚本中使用它们,但我不知道这是否是最好的方法。 - Luca Kiebel
你如何定义和使用它们?例如,我正在传递给HTML的myObj,你如何在HTML中将其定义为常量以使用它?谢谢。 - Jack
3个回答

0
如果myObj是一个对象,假设它是的话,使用JSON.stringify()
<script>
    var myObj = <%- JSON.stringify(myObj) %>;
</script>

嗨,谢谢你的回答。如果脚本在HTML文件中,这个方法是可行的。但是如果我的脚本在自己的文件中,我该如何访问myObj? - Jack

0

我曾经使用过 require.js 来实现类似的功能。 require.js 会加载包含你想要运行脚本的 .js 文件,同时把 myObj 传递给它。


server.js

res.render('index', {myObj: myObj});

index.ejs

// index.js is your separate .js file which is declared as entry point
<script data-main="index.js" src="<PATH_TO_REQUIRE_JS>"></script>
<script>
  requirejs.config({
    config: {
      // By default load any modules from this folder
      baseUrl: './js',
      // index must be used as name here in order to pass myObj into ./js/index.js
      "index": {
        "myObj": "<%= myObj %>"
      }
    }
  });
</script>

index.js

var myObj = module.config().myObj;

  • <script data-main="../js/index.js" 将你的独立 .js 文件定义为一个模块。

  • requirejs.config() 将指定的键传递给已声明的模块。

  • module.config().<SOME_KEY>; 将为每个模块提供每个指定键的值。


非常感谢您的回答,但我还没有成功,不过我认为我可能犯了一个错误,我会再试一次。不过,我发现 Luca 的答案更容易理解。请问这种方法有什么优势吗?谢谢。 - Jack
从代码角度来看,Luca的答案更简单,你是对的。但它使用了全局变量,有时可能会引起麻烦。 - Bee
@Jack,我刚刚看到我在调用requirejs.config({...});时也使用了baseUrl选项。定义此选项非常重要,因为config选项仅使用文件名称而不是相对路径。我使用baseUrl更新了我的答案。 - Bee
嗨,David,非常感谢你的回复,我学到了很多。我从未想过做这样的事情会如此复杂,你的方法确实非常独特。 - Jack

0

正如我在评论中所述,我总是在HTML文档的顶部定义要传递给客户端JS的值,就像这样,然后在定义之后加载使用这些变量的脚本:

<!doctype html>
<html>

<head>
  <script>
    /** constants from Express **/
    let myObj = <%- JSON.stringify(myObj) %>;
    //'-' must be used here not '=' after <% for it to work)
    let someString = "<%= someString %>";
  </script>
</head>

<body>
    ...
<script src="scripts/someJS.js"></script>
</body>

</html>

现在,scripts/someJS.js可以使用这些变量了。


嗨,我不知道为什么这对于 someString 起作用,但对于 myObj 不起作用,当我声明 let myObj = <%= myObj %> 时,它停止了我的脚本。 - Jack
现在可以试试吗? - Luca Kiebel
1
尝试了一下,发现 let myObj = <%= JSON.stringify(myObj) %>; 这行代码必须改为 let myObj = <%- JSON.stringify(myObj) %> 才能像 Lawrence 的回答那样正常运行。然后你的代码可以用于外部文件编码,不知道为什么没有使用 JSON.stringify 时无法正常工作,不过如果你没有问题的话就没事了。无论如何,感谢你的帮助! - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接