3

私はごく最近、node.js+express コンボを使い始めましたが、自分のビューだけでなく、ルート設定 (デフォルトの Express 構成では route/index.js) 内でも dynamicHelpers を使用する必要があることに気づきました。別のパターンを使用する必要がありますか?

app.js

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

以下では、dynamicHelpers に設定したものに簡単にアクセスできるようにしたいと考えています。これは、私の考えでは同じコンテキストであるためです..では、なぜ 2 回設定するのですか?

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

さまざまな方法でデータを渡すことができることはわかっていますが、コードを繰り返したくないので、共通のコンテキストを一度だけ設定し、可能な限りきれいに設定したいと考えています。批判や良いアドバイスを歓迎します!

4

2 に答える 2

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

ルート.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)
    })
  }
};
于 2012-05-17T19:40:24.763 に答える
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 に従ってください/

res.localsルート設定で利用可能であり、ビューにバインドされている、新しい高速で簡素化された dynamicHelpers を使用できます。

例:

// 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.languageなりres.locals.translateました。私の見解では、単に使用できますtranslate('something')

于 2012-05-20T13:24:52.880 に答える