node.js和express:使用多个视图目录

时间:2015-06-05 06:26:54

标签: node.js express

使用node.js 0.12.35和Express 4.x. 目前,我需要访问不同位置的视图。因此,Express 4.x的API文档说app.set方法的views属性将采用“应用程序视图的目录或目录数组。如果是数组,则按照它们出现的顺序查找视图阵列。“ 那么请你给我一个如何定义这样一个数组的例子?到目前为止我尝试的所有内容都以此错误消息结束。 我为app.set使用了以下样式

app.set('views', ['/my/path/components/views/' + 'base', '/my/path/components/views/' + 'starters']);

但它不起作用。我收到一条错误消息:

TypeError: **Arguments to path.join must be strings**
    at path.js:360:15

那我错过了什么?如何向app.set添加数组? 实际上我已经尝试自己调试它并查看了express的view.js脚本。从那里我可以看到数组正确传递给这个脚本,我可以看到两个不同的根路径,但从那里它没有正确构建不同的完整路径,在我的情况下.jade文件,因为我使用玉引擎。这意味着具有根路径的下一个path.join和文件本身不起作用并抛出错误。深入挖掘,看起来像path.join无法接受数组?但是多视图路径应该如何工作呢?我认为,Express 4.x应该能够使用多个视图,但是如果开箱即用的views.js无法处理这样的数组呢?我迷路了...

3 个答案:

答案 0 :(得分:0)

您无法为视图设置多个文件夹。你可以做的是将视图设置为:

app.set('views', '/my/path/components/views/');

然后从基础文件夹使用

呈现例如index.html
res.render('base/index');

即使您使用的阵列工作,您需要告诉快递在哪个文件夹中您想要的视图,对吧?如果我问的话你会怎么做?

答案 1 :(得分:0)

所以最后,在robertklep的帮助下,答案是,它是package.json中的版本问题。 无效与这些依赖

"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"jade": "~1.6.0"

}

但它适用于声明的这些依赖项:

 "dependencies": {
    "express": "~4.12.4",
    "body-parser": "~1.12.4",
    "cookie-parser": "~1.3.5",
    "morgan": "~1.5.3",
    "serve-favicon": "~2.2.1",
    "debug": "~2.2.0",
    "jade": "~1.10.0"
  }

答案 2 :(得分:0)

在Express> = 4.10

中原生支持使用多个视图文件夹的功能

您应该将一组位置传递给views属性,如下所示:

app.set('views', [__dirname + '/oneViewFolder', __dirname + '/anotherViewFolder']);

在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 + '/oneViewsFolder', __dirname + '/anotherViewFolder']);

我希望能帮到你