升级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">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© 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
相关产品推荐
相关产品推荐

