Nodejs + Handlebars - 拉当前url路径并传递给Helper

时间:2016-09-04 15:00:08

标签: node.js express path handlebars.js

我正在尝试创建一个元标记把手帮助器,它抓取url路径名并将该值用于switch语句,然后将该字符串返回到HTML头中的元标记,但我不确定当前的最佳方法抓住我的switch语句的url路径。我尝试了window.location.pathname,但收到的错误是window未定义。我知道路径模块要求你传递一些东西来解析它,但我不确定它的最佳价值是什么。任何人都可以帮助我吗?

这是我的把手帮助文件:

var path = require('path');

    var metaHelpers = function(hbs) {

    hbs.registerHelper('metaTitle', function(){
        var urlPath = path.dirname();
        console.log(urlPath);
        switch(urlPath) {
            case "/": {
                return 'Index Test'
            }
            break;
            case "/login": {
                return 'Login Test'
            }
            break;
            default: {
                    return 'No Meta Tag'
                }
            }
    });

    };

    module.exports = metaHelpers;

1 个答案:

答案 0 :(得分:1)

由于您的模板在服务器上执行,因此无需查询window个对象。相反,您必须从当前的Request对象获取URL路径。幸运的是,在Express中,Request对象具有path属性。

但是,为了将您的解决方案实现为Handlebars帮助程序,您需要找到一种方法将Request对象(或至少其.path)从视图传递给帮助程序。我认为更好的解决方案是执行辅助逻辑并在呈现响应之前构造标题

Express具有middleware的概念,它是可以基于每个请求修改请求和响应对象的函数。我们可以编写一个中间件函数来为每个请求构造标题,然后将其添加到Response对象的locals属性中。 res.locals对象的属性可用于为当前响应呈现的视图。

app.use(function (req, res, next) {
    switch (req.path) {
        case '/':
            res.locals.title = 'Index Test';
            break;
        case '/login':
            res.locals.title = 'Login Test';
            break;
        default:
            res.locals.title = 'No Meta Tag';
    }
    next();
});

在我们的布局中,我们可以像访问视图模型的任何其他属性一样访问title属性。

<title>{{title}}</title>

作为参考,this answer提供了类似的解决方案,只是它将req对象分配给res.locals