1. ホーム
  2. node.js

[解決済み] Express / Node.JSを使用してすべてのビューでアクセス可能なグローバル変数を作成する方法は?

2023-05-24 15:10:25

質問

さて、私は ジキル とファイル内の変数を定義することができます _config.yml これは、すべてのテンプレート/レイアウトでアクセス可能です。私は現在 Node.JS / エクスプレス EJS テンプレートと ejs-locals (パーシャル/レイアウト用。のようなグローバル変数と同じようなことをしたいと思っています。 site.title にある _config.yml 誰もがJekyllに精通している場合。 私はサイトのタイトル、(むしろページタイトル)、著者/会社名のような変数を持っている、それは私のすべてのページで同じままです。

ここでは、私が現在やっていることの例です...:

exports.index = function(req, res){
    res.render('index', { 
        siteTitle: 'My Website Title',
        pageTitle: 'The Root Splash Page',
        author: 'Cory Gross',
        description: 'My app description',
        indexSpecificData: someData
    });
};

exports.home = function (req, res) {
    res.render('home', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Home Page',
        author: 'Cory Gross',
        description: 'My app description',
        homeSpecificData: someOtherData
    });
};

サイトのタイトル、説明、著者などの変数を一箇所で定義し、EJSを通してレイアウトやテンプレートにアクセスできるようにしたいのですが、その際、オプションとして res.render . これを行うには、各ページに固有の他の変数を渡すことを可能にする方法がありますか?

どのように解決するのですか?

このページでは Express 3 API リファレンス を実行すると、探していたものが見つかりました。具体的には、以下のエントリです。 app.locals そして、もう少し下の方にある res.locals は、私が必要としている答えを持っていました。

私は自分で発見したのです、関数 app.locals はオブジェクトを受け取り、そのすべてのプロパティをアプリケーションにスコープされたグローバル変数として保存します。これらのグローバルは、各ビューにローカル変数として渡されます。この関数は res.locals しかし、関数はリクエストにスコープされているため、レスポンスのローカル変数はその特定のリクエスト/レスポンス中にレンダリングされたビューにのみアクセス可能です。

ですから、私の場合 app.js を追加しました。

app.locals({
    site: {
        title: 'ExpressBootstrapEJS',
        description: 'A boilerplate for a simple web application with a Node.JS and Express backend, with an EJS template with using Twitter Bootstrap.'
    },
    author: {
        name: 'Cory Gross',
        contact: '[email protected]'
    }
});

そして、これらの変数はすべて、ビューで site.title , site.description , author.name , author.contact .

また、リクエストに対する各レスポンスに対してローカル変数を定義するために res.locals として、ページのタイトルのような変数を渡すこともできます。 options パラメータとして渡すこともできます。 render を呼び出します。

EDITです。 この方法は ではなく を使用すると、ミドルウェアでこれらのローカルを使用することができます。私は実際に、下のコメントでPickelsが提案しているように、このことに遭遇しました。この場合、彼の別の回答(感謝)にあるようなミドルウェア関数を作成する必要があります。あなたのミドルウェア関数は、それらを res.locals に追加し、各レスポンスに対して next . このミドルウェアの関数は、これらのローカルを使用する必要がある他のミドルウェアの上に配置する必要があります。

EDITです。 ローカルを宣言する際のもう一つの違いは app.localsres.localsapp.locals では、変数は一度だけ設定され、アプリケーションの実行中はずっと保持されることです。でローカルを設定すると res.locals でローカルを設定すると、これらはリクエストを受けるたびに設定されます。基本的には、グローバル変数の設定は app.locals を通して設定することをお勧めします。 req 変数に依存する場合を除きます。もし値が変化しないのであれば、その値を一度だけ app.locals .