如何在Express的EJS脚本标签中获取服务端传递的变量?
解决Express+EJS中服务端变量在客户端script标签无法获取的问题
问题原因分析
你之前的两种写法存在明显缺陷:
- 直接写
var hidePayment = hidePayment;:客户端JS会将hidePayment视为自身作用域内的变量,但服务端传递的变量并未被渲染到客户端代码中,最终结果是变量未定义。 - 用
var hidePayment = "{{hidePayment}}";:渲染后会生成字符串"true"或"false",而非布尔值。比如当值为false时,字符串"false"在JS中属于真值,会导致逻辑判断完全偏离预期。
正确实现方式
方式1:直接输出布尔值(适合简单类型)
利用EJS的<%= %>标签直接输出变量值,无需添加引号:
<script> var hidePayment = <%= hidePayment %>; // 测试:控制台会输出布尔值true/false及对应的类型 console.log(hidePayment, typeof hidePayment); </script>
渲染后客户端代码会变为var hidePayment = true;或var hidePayment = false;,是标准的布尔类型。
方式2:挂载到全局window对象(适合跨脚本访问)
如果需要在多个JS文件中共享这个变量,可以将其挂载到window全局对象:
<script> window.hidePayment = <%= hidePayment %>; </script>
之后在其他脚本里直接通过window.hidePayment或hidePayment即可访问。
方式3:通用JSON序列化(适合复杂类型)
如果变量是对象、数组或需要严格的类型转换,推荐用JSON.stringify配合<%- %>标签(避免HTML转义):
<script> var hidePayment = <%- JSON.stringify(hidePayment) %>; </script>
这种方法能处理所有JSON支持的类型,比如字符串会自动带引号,对象会被序列化为正确的JSON结构,同时完整保留原始类型。
内容的提问来源于stack exchange,提问作者Sara Ree
相关产品推荐
相关产品推荐

