当前位置: 首页 > 面试题库 >

Node.js + Express上的多个视图路径

长孙嘉
2023-03-14
问题内容

我正在 使用Express FrameworkNode.js上 编写CMS 。在我的CMS上,我有几个用于用户,页面等的模块。

我希望每个模块的文件都放在 单独的文件夹中包括视图文件 。有人知道我该怎么做到吗?

我将 swig 用作模板引擎,但如果有帮助,可以将其替换为其他东西。


问题答案:

最后更新

自Express 4.10起,框架支持多视图文件夹功能。

只需将一系列位置传递给views属性,就像这样。

app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);

Express 2.0

据我所知,express目前不支持多个视图路径或名称空间(就像静态中间件一样)

但是您可以自己修改查找逻辑,以使其按您想要的方式工作,例如:

function enableMultipleViewFolders(express) {
    // proxy function to the default view lookup
    var lookupProxy = express.view.lookup;

    express.view.lookup = function (view, options) {
        if (options.root instanceof Array) {
            // clones the options object
            var opts = {};
            for (var key in options) opts[key] = options[key];

            // loops through the paths and tries to match the view
            var matchedView = null,
                roots = opts.root;
            for (var i=0; i<roots.length; i++) {
                opts.root = roots[i];
                matchedView = lookupProxy.call(this, view, opts);
                if (matchedView.exists) break;
            }
            return matchedView;
        }

        return lookupProxy.call(express.view, view, options)
    };
}

您将通过调用上面的函数并传递 express 作为参数来启用新逻辑,然后将能够为配置指定视图数组:

var express = require('express');
enableMultipleViewFolders(express);
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);

或者,如果愿意,可以直接修补框架(更新其中的 view.js 文件)

这应该 可以在Express 2.x中运行 ,不确定是否可以在新版本(3.x)中使用

更新

不幸的是,上述解决方案在Express 3.x中不起作用,因为 express.view未定义的

另一个可能的解决方案是代理 response.render 函数并设置views文件夹配置,直到获得匹配:

var renderProxy = express.response.render;
express.render = function(){
    app.set('views', 'path/to/custom/views');
    try {
        return renderProxy.apply(this, arguments);
    }
    catch (e) {}
    app.set('views', 'path/to/default/views');       
    return renderProxy.apply(this, arguments);
};

我还没有测试过它,反正我还是很讨厌,不幸的是这个功能又被推迟了:https
:
//github.com/visionmedia/express/pull/1186

更新2

由于合并了以下拉取请求,因此Express
4.10中已添加此功能:https :
//github.com/strongloop/express/pull/2320



 类似资料:
  • 问题内容: 我正在尝试使用Handlebars.js作为服务器模板引擎,使用Node.js | Express创建一个简单的HelloWorld项目。 问题是我找不到使用此类链的任何示例,尤其是在使用多视图时。 例如,我想定义标题视图: 并将其与其他视图一起用于每个页面。 也许我在以错误的方式考虑这些视图,我认为该视图是一种控件,可以在任何其他视图内的任何页面上重用。 我感谢我可以从中获得的指向教

  • 问题内容: 场景 :我已经使用Node.js,Express + Handlebars作为视图引擎和MongoDB开发了一些事务性页面。 现在的问题是在模块集成期间,我得到了一些基于Express + Jade构建为视图引擎的页面。 问题 :如何集成基于 Handlebars 和 Jade 上的页面? 问题答案: 在您的 package.json中* 添加引擎和consolidate.js * 在

  • 我一直在使用在动态添加和删除视图到viewpager中显示的适配器,但并不是所有的都能正常工作。 我的ViewPager包含一些带有WebViews的自定义视图。我所做的是一个PagerAdapter的扩展类,它实现了与我第一篇文章的答案中所示的几乎相同的方法。 当我同时删除多个页面时,问题就来了。正如上面的答案中所解释的,对于删除页面,我们将适配器设置为空,然后再次设置。我使用的方法几乎与只使用

  • 问题内容: 我在Node.JS和Express框架中有点陌生,并且下面的代码有很大的问题: 正如我在注释块中所写的那样,我想执行以下操作:首先执行选择查询,保存来自 行 对象的数据,执行第二个查询,再次将接收到的数据保存在其他对象中,然后最终呈现来自两个查询的传递数据的页面。我的问题是,最好的方法是什么? 我知道有一个由匿名函数引起的问题。我试图解决这个问题超过五个小时,如下所示: 使用匿名函数将

  • 问题内容: 我觉得这是一个简单的用例,但也许我遗漏了一些东西… 我想有 两个单独的视图,它们分别由各自的菜单控制。当我单击一个菜单上的链接时(或为此),我只想更新其中一个视图。此外,只需在中反映两个视图之一。 我尝试 定义一些状态: 现在,从您最喜欢的控制器中按,然后看着它将废话换成。我还想省略此状态下的定义,因为只能在我定义的第一和第三状态之间进行更改。 我在index.html中彼此并排坐着:

  • 在这一步,你将学习如何创建一个布局模板并且通过路由功能来构建一个具有多个视图的应用。 请重置工作目录: git checkout -f step-7 注意到现在当你转到app/index.html时,你会被重定向到app/index.html#/phones并且相同的手机列表在浏览器中显示了出来。当你点击一个手机链接时,一个手机详细信息列表也被显示了出来。 步骤6和步骤7之间最重要的不同在下面列出