首页 > 解决方案 > express-ejs-layouts 忽略一些文件(不要给一些文件添加布局)

问题描述

我只想使用ejs layouts一些文件(而不是整个项目)。但是使用express-ejs-layouts它会对所有文件使用布局。这是代码的核心部分。

app.get("/page1",(req,res)=>{
  res.render("p1");
});

app.get("/page2",(req,res)=>{
  res.render("p2");
});

app.get("/page3",(req,res)=>{
  // Don't add Layout file in this page
  res.render("p3",{
    layout:null
  });
});

我在 stackoverflow 中发现,您可以通过传递objectakey layout及其value作为布局文件的名称来使用多个布局{ layout : "layoutNumberOne" }。但是将其值设置为undefinedornull不起作用。我想要的解决方案不是创建一个空的布局文件并将该文件的名称传递object给可以工作的render()函数,因为如果是这种情况,我将不得不{ layout : "emptyLayout" }在我有很多的所有页面中指定. 我正在寻找可以将 a 添加layout到特定的答案route,以便路由中的所有请求都将具有此布局文件并且不会影响其他路径。我怎样才能做到这一点 ?

标签: javascriptnode.jsexpressejs

解决方案


你可以写一个这样的辅助函数:

function demo(route, view, data={}){
    app.get(route, (req, res) => {
        let options;
        if(route === "/page3"){
            options = {
                layout: "blank-layout"
            };
        };
        const locals = {
            ...data,
            ...options
        };
        res.render(view, locals)
    });
}

并在您想要呈现页面时调用它:

demo("/page3", "p3", {anything: "whatever you want"})

在您希望传入一些动态数据以在模板中使用的可能事件中,此函数接受路由、视图文件和可选数据对象。

它设置您想要的路线,然后初始化一个名为“options”的变量,以便稍后在 if 语句给它一个值后传递给下面的“locals”对象。

然后,该函数将您的“路由”参数的值与您想要分配一些唯一选项的路由(在本例中为“/page3”)进行比较,如果结果为真,它会将“选项”变量设置为具有名为 layout 的属性和值为“blank-layout”的对象。该值与您要使用的布局文件的名称有关,因此请随意更改该值以满足您的需要。

最后,这个“选项”对象与您之前可能传入的“数据”对象合并(如果您没有传入一个,它将只使用一个空对象);合并两个对象的结果存储在“locals”变量中,现在包含您的数据对象和选项对象具有的每个属性。然后将此变量与视图文件一起传递给渲染函数。

请注意,您可以使用多个 if 语句来设置其他路由的选项


推荐阅读