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

升级EJS至3.1.5后出现SyntaxError,页面无法访问求助

这问题我之前升级EJS的时候也碰到过!核心原因是EJS 3.x对模板语法的解析比2.x严格太多,之前VS Code给你的红下划线其实就是预警,只是2.x的编译器太“宽容”,没把这个当错误处理,升级后就直接炸了。

先给你拆解问题:你script标签里的JavaScript字符串里写了<a>这类HTML标签,EJS 3.x的解析器会把所有<都当成可能的EJS标签起始(比如<%),结果看到<a后面的/就懵了,直接抛出Unexpected token '/'的错误。

下面给你两个解决方案,优先选第一个:

方案1:用EJS输出字符串避免解析冲突

把script里的attribution字符串改成用EJS的<%- %>标签结合JSON.stringify输出,这样EJS会正确处理里面的HTML标签,不会误判:

<script type="text/javascript" > 
<% if(data) { %> 
var map = L.map('map').setView([<%= data.latitude %>, <%= data.longitude %>], 11); 
var marker = L.marker([<%= data.latitude %>, <%= data.longitude %>]).addTo(map); 
// 用JSON.stringify转成合法的JS字符串,再用<%- %>输出
var attribution = <%- JSON.stringify('<a href="https://www.maptiler.com/copyright/" target="_blank">&copy; MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>') %>;
L.tileLayer('https://api.maptiler.com/maps/streets/{z}/{x}/{y}.png?key=boomBoomBoomm', { 
attribution: attribution
}).addTo(map); 
<% } %> 
</script>

另外还要纠正一个潜在的bug:你的接口代码里,fullData是axios返回的响应对象,实际接口返回的数据存在fullData.data里,所以你得把:

res.render("../views/index", {data: fullData});

改成:

res.render("../views/index", {data: fullData.data});

之前2.x可能碰巧没报错,但这是错误的用法,不改的话你的data.name、data.latitude大概率拿不到正确的值。

方案2:临时关闭EJS严格模式(不推荐长期用)

如果你想快速验证问题,也可以在Express配置里关闭EJS的严格模式,让它回到2.x的宽松状态,但这会掩盖潜在的语法问题,不推荐长期使用:

const ejs = require('ejs');
// 在初始化Express之后添加这行
ejs.configure({ strict: false });

总结一下:升级EJS 3.x后严格模式默认开启,之前被忽略的语法问题现在会触发报错,优先用方案1修复,同时修正axios数据的获取方式,这样应该就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:42:57