【问题标题】:Nodejs + Handlebars - Pull current url path and pass to HelperNodejs + Handlebars - 拉取当前 url 路径并传递给 Helper
【发布时间】:2017-01-12 02:18:44
【问题描述】:

我正在尝试创建一个元标记句柄助手,它获取 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;

【问题讨论】:

  • 您是否使用Express 作为您的网络框架?
  • @76484 是的,我是
  • 我试过req.originalUrl但收到Cannot read property 'originalUrl' of undefined

标签: node.js express path handlebars.js


【解决方案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

【讨论】:

  • 这绝对是解决问题的更好方法。为我工作。谢谢!
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多