【问题标题】:Node.js and Express - Regarding rendering pages in a directory with one callNode.js 和 Express - 关于一次调用在目录中呈现页面
【发布时间】:2014-04-17 13:37:30
【问题描述】:

希望我没有在这里重复一个问题,但我环顾四周并没有看到任何解决这个特定问题的东西。

我正在通过创建一组存储在文件夹中的独特内容块来构建一些页面 - 如下所示:

h4 Content Example
p.description.
    Lorem ipsum dolor sample text etc etc

例如,pages\contentBlocks\Example\contentExample.jade

这些内容块被添加到一个 mixin (pages\mixins.jade) 中,如下所示:

mixin contentBlock(title)
   .content-block(id=title.toLowerCase()) 
       h3 #{title}
       if block
           .content 
               block

我在一个更大的页面 (pages\portfolio.jade) 中调用这个 mixin,如下所示:

.subsection
    //- Expects a list of objects of the format { title, html }
    each val in pageBlocks
        +contentBlock(val.title)
            != val.html

(目的是稍后通过其他变量来增强这一点,这些变量可以传递到 mixin 中以进行就地格式化,例如背景图像)

我想利用 Express 的功能在一次调用中自动呈现目录中的所有页面。像这样(index.js):

var pageBlocks = [];
res.render('pages/contentBlocks/Example/*', function (err, html) {
     if (err) throw err;
     pageBlocks.push({ html: html });
});

但是,我还希望能够引用文件的标题,例如设置我放入的块的class。理想情况下,它看起来像这样:

res.render('pages/contentBlocks/Example/*', function (err, html) {
     if (err) throw err;
     pageBlocks.push({ title:functionToGetFileName(), html: html });
});

有什么方法可以在不手动遍历该目录中的文件的情况下做到这一点?

或者,因为这个方法看起来不必要的复杂(考虑到 mixins、includes、extends 和 partials 的存在,感觉我应该能够在没有额外的渲染调用的情况下做到这一点),有没有更好的方法来做到这一点?


编辑:我做了更多的环顾和代码测试,现在我不确定。 可以 Express 隐式渲染一个目录中的所有文件吗?基于this question,我认为它可以,但我可能误读了。 res.render('path/to/directory/', callback) 的格式似乎不起作用 - 我收到以下错误:

Error: Failed to lookup view "path/to/directory/" in views directory "/path/to/app/views"

【问题讨论】:

    标签: node.js express pug modular


    【解决方案1】:

    对于临时解决方案,我使用以下模式:

    exampleBlocks = [];
    eb_dir = "pages/contentBlocks/Example";
    fs.readdirSync("./views/" + eb_dir).forEach(function(file) {
        res.render(eb_dir + "/" + file, function (err, html) {
            if (err) throw err;
            exampleBlocks.push({title: file, html:html})
        });
    });
    

    这对我的口味来说已经足够简洁了,尽管多次调用res.render() 会让我的小伙伴们感到沙沙作响。我宁愿它是单批渲染,或者更好的是,通过巧妙地使用玉石结构来解决 - 但我仍然没有想到一种方法来做后者。


    编辑:

    我决定我不想简单地枚举文件夹中的文件 - 我想要更多地控制顺序。我不会在我的页面中使用each 循环,而是简单地调用带有included 内容的mixin,如下所示(在我之前的示例中为pages\portfolio.jade):

    .subsection
        +contentBlock("Block 1")
                include blocks/block1
        +contentBlock("Block 2")
                include blocks/block2
    

    不过,我将把问题留在这里,因为其他人可能会遇到类似的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多