在使用Express和node.js设置的路由中使用dynamicHelpers

时间:2012-05-17 16:05:19

标签: node.js express

我最近开始使用node.js + express组合,我偶然发现需要在我的视图中使用dynamicHelpers,而且还需要在我的路由设置中使用(默认快速配置中的routes / index.js)。我应该使用一些不同的模式吗?

app.js

app.dynamicHelpers({
    translate : function(req, res) {
        return translate;
    },
    language : function(req, res) {
        return req.session.language || "en";
    },
});

下面我想方便地访问我为dynamicHelpers设置的内容,因为在我看来它是相同的上下文..那么为什么要设置两次呢?

var routes = {};
routes.index = function(req, res) {
    res.render('index', {
        title : 'My webpage',
        categories : categoryPositions,
        referrer : req.header("Referrer"),
        languages : ["pl", "en", "de"],
        <----- here I would like to use my dynamicHelpers (for example translate)
    })
};

我知道我可以通过多种方式传递数据,但我不想重复我的代码 并希望只设置一次公共上下文,并尽可能干净利落地设置公共上下文。我欢迎任何批评和好建议!

2 个答案:

答案 0 :(得分:3)

functions.js

module.exports = {
  translate : function(req, res) {
    return translate;
  },
  language : function(req, res) {
    return req.session.language || "en";
  },
};

helpers.js

var functions = require('./functions');

app.dynamicHelpers({
  translate : functions.translate,
  language : functions.language
});

根据您的需要,您也可以像这样编写帮助

var functions = require('./functions');

app.dynamicHelpers( functions );

routes.js

var functions = require('./functions');

var routes = {
  index: function(req, res) {
    res.render('index', {
      title : 'My webpage',
      categories : categoryPositions,
      referrer : req.header("Referrer"),
      languages : ["pl", "en", "de"],
      stuff: functions.translate(req, res) // <----- here I would like to use my dynamicHelpers (for example translate)
    })
  }
};

答案 1 :(得分:3)

所以实际上解决方案是使用尚未发布的express 3.0,修改:

npm install -g express@3.0

关注https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.xhttp://www.devthought.com/code/use-jade-blocks-not-layouts/

新表达的简化dynamicHelpers使用res.locals,它们在路径设置中都可用,然后绑定到视图。

示例:

// app.
app.locals.use(function(req, res) {
    var language = req.session.language || "en";
    res.locals.language = language;
    res.locals.translate = function(clause) {
        return translate(clause, language);
    };
});

在路线设置中,我现在可以同时访问res.locals.languageres.locals.translate。 在我看来,我只能使用translate('something')