【问题标题】:Using dynamicHelpers in routes setup with Express and node.js在 Express 和 node.js 的路由设置中使用 dynamicHelpers
【发布时间】:2012-07-20 11:54:29
【问题描述】:

我最近开始使用 node.js+express 组合,我偶然发现需要使用 dynamicHelpers 不仅在我的视图中,而且在我的路由设置中(默认 express 配置中的路由/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)
    })
};

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

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    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)
        })
      }
    };
    

    【讨论】:

    • 我觉得你的建议差不多了,谢谢你的努力!但是,请考虑functions.translate(req, res) 将被调用两次。首先手动设置stuff:,然后由 Express 本身为特定视图设置。我想知道是否可以不重复设置并且只发生一次。如果它不能以一种简洁的方式改进,那么我会接受你的解决方案。
    • 那我恐怕没完全明白你的意思。我以为你只需要在你的路线中使用你的辅助功能。如果您已经在视图中拥有它并且这就是您想要的,为什么还要在您的路线中再次设置它?
    • 对于每个请求,functions 中的每个元素都会被调用,并在特定的视图上下文中设置一个值 - 这是自动完成的。当您执行stuff: functions.translate(req, res) 时,这意味着functions.translate(req, res) 将被调用两次。首先,手动初始化东西,其次是 Express。最好的解决方案是不要在每个请求和响应中调用 dynamicHelpers 两次。如果帮助程序初始化会更复杂——比如读取文件,该怎么办?我希望我能更好地解释我的观点。
    • 我想我已经找到了解决方案并发布了我自己的答案。我赞成你的一个很好的尝试。 ;)
    【解决方案2】:

    所以实际上解决方法是使用尚未发布的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/

    新的 express 简化了 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')

    【讨论】:

    • 好像3.0rc不支持 app.locals.use ,而是在app.use(app.router)之前使用app.use(fn);
    • 您好,感谢您的回答。但是如果我在translate 中有一个回调,说它正在请求一些资源。那么它将如何返回结果。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2017-11-23
    • 2012-06-18
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多