使用express从模板内部访问mountpath变量

时间:2015-04-10 02:35:42

标签: node.js express handlebars.js

是否有一种干净的,推荐的方式从模板内部访问mountpath,因此一个快速应用程序可以独立运行,也可以作为另一个应用程序的一部分运行(通过app.use),路径指向正确的目的地?

类似的东西:

{{mountpath}}route/to/file

因此,如果应用程序是独立运行的,则mountpath将为/,如果作为子模块运行,则mountpath可以是/foo/

注意:我正在使用把手。

3 个答案:

答案 0 :(得分:0)

express.static中间件负责提供Express应用程序的静态资产。 工作原理:

  • 从应用程序目录中的“public”目录提供应用程序的静态内容

    // GET /style.css等

    app.use(express.static(__ dirname +'/ public'));

  • 将中间件安装在“/ static”以仅在其请求路径以“/ static”为前缀时提供静态内容

    // GET /static/style.css等。

    app.use('/ static',express.static(__ dirname +'/ public'));

  • 从多个目录提供静态文件,但优先于“./public”而不是其他目录

    app.use(express.static(__ dirname +'/ public'));

    app.use(express.static(__ dirname +'/ files'));

    app.use(express.static(__ dirname +'/ uploads'));

在你的情况下你可以使用第二种情况,即;在'/ static'路径上挂载文件,因此可以使用 src ='/ static / filename.xyz'访问公共文件夹下的任何文件 使用子文件夹css,js,images创建文件夹名称public 或者,如果您希望将css安装在路径/css上,那么您可以:

app.use('/css',express.static(path.join(__dirname, 'module1/css')));

现在,您可以将整个应用程序中的所有css文件用作:

 <link href="css/style.css" rel="stylesheet">

答案 1 :(得分:0)

有一个event that is fired after the module is mounted,所以我可以这样做:

app.locals.modulePath = "/";

app.on('mount', function (parent) {
  app.locals.modulePath = app.mountpath;
});

可以从所有视图中直接访问本地人,因此可以像{{modulePath}}

一样访问

答案 2 :(得分:0)

我遇到了同样的问题 - 需要在模板中使用mountpath。

对我有用的解决方案基于2个事实

  1. mountpath可在请求中找到 - req.baseUrl
  2. 响应本地对象被导出到模板 - res.locals
  3. 首先,创建一个单行中间件 - 这将适用于module / subapp

    内的所有路由
    router.use(function (req, res, next) {
        res.locals.baseUrl = req.baseUrl;
        next();
    });
    

    然后在模板中使用#{baseUrl}/some/route - 请注意这是jade语法,但我认为它与把手的工作原理相同。