我正在写一篇关于Node.js with Express Framework的CMS.在我的CMS上,我有几个用于用户、页面等的模块.

我希望每个模块的文件都在separate folderincluding the view files上.

我使用swig作为我的模板引擎,但如果有帮助的话,我可以将其替换为其他内容.

推荐答案

Last Update

The multiple view folders feature is supported by the framework since 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文件)

这应该是work in Express 2.x,不确定新版本(3.x)是否会

UPDATE

不幸的是,上述解决方案在Express 3中不起作用.因为express.view等于undefined

另一种可能的解决方案是代理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);
};

我还没有测试过它,不管怎么说,它让我感觉很不舒服,不幸的是,这个功能又被取消了:

UPDATE 2

此功能已添加到Express 4.10中,因为以下拉取请求已被合并:

Node.js相关问答推荐

如何使用NodeJS处理来自请求的单个或多个文件?

购物车是空的状态|本地存储不更新产品数量|Redux|

车把模板引擎循环问题

有没有办法判断 UUID 是否是使用 node.js 中的特定命名空间生成的?

Google App Engine 突然不允许我部署我的 node.js 应用程序

在 nodejs 中使用 multer 上传文件返回未定义的 req.file 和空的 req.body

Express.js cookie setter 的 Domain 属性:如何与 *多个 * 域共享 cookie?

部署云功能 Firebase/Stripe 时出错

如何将使用 Gulp 的 node 部署到 heroku

使用 Node.js 在内存中缓冲整个文件

我可以向NPM添加调试脚本吗?

node.js 是否支持yields ?

Mongoose:查找、修改、保存

PhoneGap/Cordova Android 开发

如何从 Node.js 中的 URL 获取

如何忽略文件 grunt uglify

使用 gzip/deflate 压缩的简单 HTTP 请求

node.js 服务器和 HTTP/2 (2.0) 与 express.js

Google Firebase 错误(函数返回未定义、预期的 Promise 或值)

如何创建安全(TLS/SSL)Websocket 服务器