在Node.js中使用插值EJS包括

bot*_*les 15 include ejs node.js express

我的Express应用程序正在使用EJS,我的views目录如下所示:

./views
  ./contents
    home.ejs
  ./includes
    header.ejs
    footer.ejs
  layout.ejs
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据contents我的routes/index.js中命名的局部变量有条件地在layout.ejs视图中加载home.ejs .那个文件看起来像这样:

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Home', contents: 'home.ejs' });
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我可以简单地写(在layout.ejs中):

<% include '/contents' + contents %>
Run Code Online (Sandbox Code Playgroud)

其中尾部"contents"是局部变量,其中包含要加载的正文文本的相对路径.

但是,似乎EJS总是按照include字面上的指令来解释文本,并且没有机会发生任何插值魔法.

我也试过无济于事:

<% function yieldContent(contents){ %>
  <% var contentPath = 'contents/' + contents; %>
  <% include contentPath %>
<% }; %>
<% loadContent(); %>
Run Code Online (Sandbox Code Playgroud)

有没有人有条件地包含基于路线中传递的变量的视图的创造性解决方案?

lev*_*ram 4

我认为 EJS 中没有办法进行这种动态包含。它可能会打破业务逻辑和视图的分离。解决方案可以是在控制器中渲染子模板,并将其内容传递到布局。

要在控制器中渲染子模板,请使用如下所示的内容:

var ejs = require('ejs'),
, fs = require('fs')
, home = ejs.render(fs.readFileSync("contents/home.ejs", "utf-8"))
Run Code Online (Sandbox Code Playgroud)