错误EJS标签为何引发SyntaxError: Unexpected token ')'错误?
EJS中使用
<%= %>包裹forEach循环导致语法错误的原因解析 问题场景
在基于Node.js和EJS模板的项目中,尝试渲染从后端传递的用户秘密列表时触发语法错误,将EJS标签从<%= %>改为<% %>后问题解决,但需理解错误成因。
代码示例
app.js
const express = require('express'); const ejs = require('ejs'); const app = express(); app.set('view engine', 'ejs'); app.get("/secrets", (req, res) => { const user1 = { "username": "jon", "secret": "blue blue blue"}; const user2 = { "username": "paul", "secret": "red red red"}; const users = [user1, user2]; res.render("secrets", {usersWithSecrets: users}); }); app.listen(3000, function() { console.log("Server started on port 3000."); });
secrets.ejs(错误版本)
<html> <body> <h1>Secrets List:</h1> <%= usersWithSecrets.forEach((user) => { %> <p class="secret-text"><%=user.secret%></p> <%})%> <hr> </body> </html>
错误信息
SyntaxError: Unexpected token ')' in C:\Users\Owner\Desktop\Sams\scode\Learning\Authentication_and_Redux\code\starting_code\Secrets-Starting_Code\views\secrets.ejs while compiling ejs
错误成因解析
1. EJS标签的核心区别
EJS的两种常用标签功能完全不同:
<%= %>:输出表达式结果,会将标签内JavaScript代码的返回值转义后插入到HTML中,仅适用于需要输出内容的场景(比如<%= user.secret %>)。<% %>:执行控制逻辑,用于循环、条件判断等不需要输出返回值的代码,仅负责控制模板渲染流程。
2. 错误的根本原因
当你用<%= %>包裹forEach循环时,EJS会尝试将forEach的执行结果输出到HTML中,但:
- 首先,
forEach方法的返回值是undefined,本身就没有输出意义; - 更关键的是,EJS解析器会把
<%= %>内的内容当作一个完整的JavaScript表达式处理,此时箭头函数的{}会被错误解析为对象字面量,破坏了整体语法结构,最终导致解析器抛出Unexpected token ')'的语法错误。
改为<% %>后,EJS会直接执行循环逻辑,循环内部的<%= user.secret %>负责输出每个用户的秘密,完全符合标签的功能定位,因此错误消失。
3. 为何没有提示标签使用错误?
EJS解析器的优先级是先尝试解析标签内的JavaScript语法是否合法,而非先判断标签类型是否匹配使用场景。当标签内的代码因结构问题(箭头函数在输出表达式中的写法)导致JavaScript语法解析失败时,就会抛出通用的语法错误,而非专门的EJS标签误用提示。
内容的提问来源于stack exchange,提问作者the-mad-neuroscientist
相关产品推荐
相关产品推荐

