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

编译EJS时出现SyntaxError: Unexpected token '.' 求助(初学者)

排查EJS编译时SyntaxError: Unexpected token '.'错误的步骤

1. 孤立验证布局文件本身

先跳过多域名逻辑,写一个简单路由直接渲染目标布局,确认错误是否来自文件本身:

app.get('/test-layout', (req, res) => {
  // 直接指定布局路径,排除域名映射干扰
  res.render('index', { layout: 'layouts/layout01' });
});

如果访问该路由仍报错,说明问题出在layout01.ejs文件内,而非多域名配置。

2. 逐行检查layout01.ejs的语法错误

Unexpected token '.' 大概率是EJS模板内的JS语法错误,重点排查<% %>或<%= %>标签里的代码:

  • 有没有类似<%= .username %>的错误写法(缺少变量前缀,正确应为<%= user.username %>)
  • 有没有在条件判断里写错,比如<% if (.isAdmin) { %>(正确应为<% if (user.isAdmin) { %>)
  • 如果用了可选链?.,确认EJS版本支持(低于v3.0.0的版本不支持,需替换为user && user.username这种写法)
  • 检查是否有未闭合的标签或语法结构,比如<% for (let item in list) { %>忘记加<% } %>

3. 验证多域名映射逻辑的正确性

检查domains.json的结构和读取逻辑:

  • 确保JSON格式合法,字符串用双引号,无 trailing comma:
    {
      "your-domain.com": "layouts/layout01",
      "another-domain.com": "layouts/layout02"
    }
    
  • 检查读取JSON的中间件,确保返回的layout值是有效字符串,避免传递undefined:
    const domainConfig = require('./domains.json');
    app.use((req, res, next) => {
      const currentDomain = req.hostname;
      // 必须加默认值,防止域名未匹配时传递无效值
      res.locals.layout = domainConfig[currentDomain] || 'layouts/default';
      next();
    });
    

4. 检查中间件配置兼容性

  • 确认express-ejs-layouts的初始化顺序正确,要在app.set('view engine', 'ejs')之后:
    const expressLayouts = require('express-ejs-layouts');
    app.set('view engine', 'ejs');
    app.use(expressLayouts);
    app.set('layout', 'layouts/default'); // 设置全局默认布局
    
  • 排查i18n中间件的使用,比如是否写错翻译函数调用,比如<%= __.('welcome') %>(正确应为<%= __('welcome') %>)

5. 更新依赖版本排除兼容问题

运行命令更新EJS和相关中间件,避免版本不兼容导致的解析错误:

npm update ejs express-ejs-layouts

内容的提问来源于stack exchange,提问作者Bruno Ribeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:36:21