我正在尝试创建一个元标记把手帮助器,它抓取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;
答案 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
。