如何从自定义车把助手访问请求对象

jfr*_*d00 5 javascript mustache handlebars.js

我正在使用带有node.js和express的把手,我有一个用于温度显示的自定义注册助手,我希望能够从页面URL访问查询参数.

助手背后的概念是自动根据是否处理华氏摄氏转换?tempFormat=F或者tempFormat=C是URL或没有.这是我想要的自定义助手的伪代码:

hbs.registerHelper("formatTemp", function(temp) {
    if (query parameter says to use Fahrenheit) {
        temp = toFahrenheitStr(temp);
    }
    return temp;
});
Run Code Online (Sandbox Code Playgroud)

所以,我希望我的模板看起来像这样:

{{#each temperatures}}
    <div class="row {{{stripes @index}}}"> 
        <div class="time">{{prettifyDate t}}</div>
        <div class="atticTemp">{{formatTemp atticTemp}}</div>
        <div class="outsideTemp">{{formatTemp outsideTemp}}</div>
        <div class="spacer"></div>
    </div>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

我现在正在解决这个问题request.query.tempFormat,将其拉入并提供给模板渲染的数据:

app.get('/debug', function(request, response) {
    var tempData = {
        temperatures: data.temperatures,
        units: request.query.tempFormat || "C"
    };
    response.render('debug', tempData);
});
Run Code Online (Sandbox Code Playgroud)

然后,在模板中传递该数据:

{{#each temperatures}}
    <div class="row {{{stripes @index}}}"> 
        <div class="time">{{prettifyDate t}}</div>
        <div class="atticTemp">{{formatTemp atticTemp ../units}}</div>
        <div class="outsideTemp">{{formatTemp outsideTemp ../units}}</div>
        <div class="spacer"></div>
    </div>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

但是,这看起来很麻烦,因为我必须将温度单位传递给每个模板渲染调用,然后我必须将它们放在每个模板中,我希望它们被温度显示器使用.他们已经坐在请求对象中了.那么,我正在试图弄清楚如何从把手自定义帮助函数访问请求对象?这样,我可以为每个渲染保存代码并在每个模板中保存代码,并使tempFormat查询参数自动应用于formatTemp我的模板中的任何使用.

有没有人知道如何在不使用全局的情况下从把手自定义助手访问请求对象?

Rol*_*and 8

首先,您需要通过在路由之前的任何位置注册中间件来将请求对象分配给本地响应

app.use(function(req,res,next){
    res.local.req = req;
    next();
})
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问助手中的查询对象

<div class="atticTemp">{{formatTemp atticTemp ../req.query.tempFormat }}</div>
Run Code Online (Sandbox Code Playgroud)

  • 可能是特定于版本的,但我必须使用:{ res.locals.req = req; } (3认同)

Meh*_*ŞAR 0

我正在使用express-handlebars 包。您可以在其配置对象上注册助手,如下所示。与您的方式略有不同,但您会明白的。为了简化事情,我刚刚在辅助函数中添加了第二个参数(:

var exphbs  = require('express-handlebars');

app.engine('handlebars', exphbs({
    defaultLayout: 'layout',
    helpers : {
        formatTemp: function(temp, unit) {
            console.log(unit);
            if (unit=="F") {
                return temp;
            } else {
                return 32 + (temp* 9 / 5);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

context的数据结构和用法是一样的。

已测试。