我正在使用 Express 制作一个小型 Node Web 应用程序。但如果我的 ejs 文件包含 else 语句,我会收到错误。如果还不清楚,这里有一个 MWE:
pages/test.ejs:
<html>
<head></head>
<body>
<% var foo = "x"; %>
<% if (2==3) {foo = "y";} %>
<% else {foo = "z";} //If I delete this line, everything works %>
<%= foo %>
</body>
</html>
index.js:
var express = require('express');
var app = express();
app.set('port', (process.env.PORT || 5000));
app.set('views', __dirname + '/pages');
app.set('view engine', 'ejs');
app.get('/test/', function(request, response) {
response.render("test");
});
如果我随后尝试访问 localhost:5000/test,我只会看到以下错误消息:
语法错误:编译 ejs 时 C:\path o\my iles\pages est.ejs 中存在意外标记
如果上述错误没有帮助,您可能想尝试 EJS-Lint: https://github.com/RyanZim/EJS-Lint 在新函数()处 在 Template.compile (C:\我的文件路径 ode_modules js\lib js.js:524:12) 在 Object.compile (C:\我的文件路径 ode_modules js\lib js.js:338:16) 在handleCache (C:\我的文件路径 ode_modules js\lib js.js:181:18) 在 tryHandleCache (C:\我的文件路径 ode_modules js\lib js.js:203:14) 在 View.exports.renderFile [作为引擎] (C:\path o\my iles ode_modules js\lib js.js:412:10) 在 View.render (C:\我的文件路径 ode_modules xpress\lib iew.js:126:8) 在 tryRender (C:\我的文件路径 ode_modules xpress\lib application.js:639:10) 在 Function.render (C:\我的文件路径 ode_modules xpress\lib application.js:591:3) 在 ServerResponse.render (C:\我的文件路径 ode_modules xpress\lib esponse.js:960:7)
但是如果我删除
<% else {foo = "z"} %>
行,一切都会完美运行!给什么?
这应该适合你
<html>
<head></head>
<body>
<% var foo = "x"; %>
<% if (2==3) {foo = "y";} else {foo = "z";} %>
<%= foo %>
</body>
</html>
或者如果您需要单独的行
<html>
<head></head>
<body>
<% var foo = "x"; %>
<% if (2==3) {foo = "y";} else { %>
<% foo = "z";} %>
<%= foo %>
</body>
</html>
您可以尝试从独立脚本编译模板:
const ejs = require('ejs');
console.log(ejs.compile(`
<html>
...
</html>
`, { debug : true }));
debug
选项后,您可以看到模板被编译成什么:
var __output = [], __append = __output.push.bind(__output);
with (locals || {}) {
; __append("\n<html>\n<head></head>\n<body>\n ")
; var foo = "x";
; __append("\n ")
; if (2==3) {foo = "y";}
; __append("\n ")
; else {foo = "z";}
; __append("\n\n ")
; __append(escapeFn( foo ))
; __append("\n</body>\n</html>\n")
}
return __output.join("");
注意
; __append()
是如何插入到if
和else
行之间的,打破了if () { ... } else { ... }
的语法。
对于解决方案,我将遵循@ponury-kostek 发布的答案。
我认为您遇到问题是因为 ejs 中的 if-else 语法。在 ejs 中的 if-else 语句中使用括号的首选方法是:
<html>
<head></head>
<body>
<% var foo = "x"; %>
<% if (2==3) {foo = "y"; %>
<%} else {%>
<%foo = "z";}%>
<%= foo %>
</body>
</html>
尝试安装 ejs-lint 包。这对我有用。
npm i ejs-lint