.ejs 文件如果包含 else 语句则不会呈现

问题描述 投票:0回答:4

我正在使用 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"} %>
行,一切都会完美运行!给什么?

node.js express ejs
4个回答
4
投票

这应该适合你

<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>

0
投票

您可以尝试从独立脚本编译模板:

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 发布的答案。


0
投票

我认为您遇到问题是因为 ejs 中的 if-else 语法。在 ejs 中的 if-else 语句中使用括号的首选方法是:

<html>
<head></head>
<body>
  <% var foo = "x"; %>
  <% if (2==3) {foo = "y"; %>
  <%} else {%>
  <%foo = "z";}%>
  <%= foo %>
</body>
</html>

-1
投票

尝试安装 ejs-lint 包。这对我有用。

npm i ejs-lint
© www.soinside.com 2019 - 2024. All rights reserved.