EJS输出标签含感叹号触发SyntaxError问题求助
问题分析与解决
问题核心
在Node.js环境的localhost:3000运行EJS代码时,三元表达式中带感叹号的字符串会触发SyntaxError: Invalid or unexpected token,移除感叹号则正常运行,尝试多种转义方式均无效。
代码复现
<body> <h1>Home Page</h1> <ul> <li>Name: <%= restaurant.name %></li> <li>Address: <%= restaurant.address %></li> <li>Phone: <%= restaurant.phone %></li> <li> <%= restaurant.isOpen === true ? "Yes, we are open!" : "No, we are closed" %> </li> </ul> </body>
原因解析
问题出在多行字符串的写法上:你在双引号内将"No, we are closed"拆成了两行,普通单/双引号不支持原生多行字符串,EJS编译时会把换行符和后续缩进当成语法的一部分,结合感叹号后触发了解析器的误判,导致语法错误。转义方式无效是因为问题根源不在感叹号本身,而是多行字符串的解析逻辑冲突。
解决方案
方案1:将字符串写在同一行
把三元表达式的两个分支字符串都放在一行,避免换行导致的解析问题:
<li> <%= restaurant.isOpen ? "Yes, we are open!" : "No, we are closed" %> </li>
方案2:使用模板字符串(反引号)
ES6模板字符串支持原生多行写法,用反引号包裹字符串即可正常解析:
<li> <%= restaurant.isOpen ? `Yes, we are open!` : `No, we are closed` %> </li>
方案3:升级EJS版本
部分旧版EJS对多行字符串+特殊字符的解析存在bug,执行npm install ejs@latest升级到最新稳定版也可能解决该问题。
内容的提问来源于stack exchange,提问作者padcoding
相关产品推荐
相关产品推荐

