编译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
相关产品推荐
相关产品推荐

