You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

错误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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:15:35