【问题标题】:node.js and express: use more than one views directorynode.js 和 express:使用多个视图目录
【发布时间】:2015-06-05 06:26:53
【问题描述】:

使用 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 不能处理这样的数组怎么办?我迷路了……

【问题讨论】:

  • 你写“我用了下面的样式”。但是,那是您正在使用的 exact 代码吗?将多个视图目录作为数组传递对我来说很好 (example)。
  • 感谢您的示例。你是对的,如果一切都在 node.js 脚本启动的目录中,它就可以工作。但我需要从该目录的外部启动它。因此,如果我的 app.js 位于 /my/path/components/application 中,我希望有目录 /my/path/components/base 和 /my/path/components/starters 用于视图。当我尝试这样做时,我失败了。
  • 这对我来说也很好用(例如 /tmp 中的 app.js,查看 /var/tmp 中的目录)。在我看来,您正在以编程方式构建路径字符串,也许会因此而失败?
  • 好吧,现在我真的很困惑。不幸的是,我清理了我的系统,因为有了你的提示,我想我现在知道该怎么做了。但是现在您的测试代码在我的环境中也不起作用。所以我认为这与 node.js 和 express 的版本有关。所以 node.js 我正在运行 0.12.4 并表示 4.12.4 (当您的代码之前工作时,我升级到了这个版本)。所以此刻我完全迷失了。
  • 好吧,看来我现在明白了。好像是版本问题。在 npm install 之后,它就可以工作了。

标签: node.js express


【解决方案1】:

您不能将多个文件夹设置为视图。您可以做的是将视图设置为:

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

然后从基本文件夹中渲染例如 index.html 使用

res.render('base/index');

即使您使用的数组有效,您也需要告诉 express 您想要的视图在哪个文件夹中,对吗?如果我可以问,你会怎么做?

【讨论】:

  • The Express documentation 明确声明您可以设置多个视图目录,以及它将如何处理此类配置:“如果是数组,则查找视图按照它们在数组中出现的顺序。”
【解决方案2】:

最后,在 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"
  }

【讨论】:

    【解决方案3】:

    Express >=4.10原生支持使用多个视图文件夹的功能

    您应该将位置数组传递给视图属性,如下所示:

    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']);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多