多くのルートを使用する場合のres.render()のミドルウェア

リッチー

ローカルで使用するためのWebページを作成しました。以下に示すようなルートがたくさんあり.ejsます。31ファイルと3.htmlファイルです。(それらはすべて同じ「ビュー」フォルダーにあります)。

//app.js - using node and express
    app.get('/page1', function(req, res){
        res.render('page1');
    });
    app.get('/page2', function(req, res){
        res.sendFile('views/page2.html', { root: __dirname });
    });

app.getはこれらのファイルのすべてにを使用します。DRYコードではないと感じていたので、今は同じ結果を達成するためのよりエレガントで最適な方法を見つけようとしています。

  • 多くres.sendFile();は単一のexpress.static()ミドルウェアステートメントに置き換えることができることを私は知っています。私は通常、express.static()すべてのcssファイルを保存するために使用する「パブリック」フォルダーで使用します-このようにapp.use(express.static(path.join(__dirname, 'public')));しかし、これを使用してすべてを単純化する方法がまだわかりませんres.sendFile()

  • 多くのres.render();ルートについては、カスタマイズされたデータを渡さなければ、テンプレートファイルのディレクトリ全体(および対応するルート)またはファイルのリストを処理する単一のミドルウェアに置き換えることができることを私は知っています。どうすればいいのかわからない。


どんな助けでも大歓迎です、ありがとう!


[更新]

  • リッチー
    • node_modules
    • 公衆
      • cssファイル、画像など
    • ビュー
      • パーシャル
        • すべての部分ファイル
      • プログラミングパブリック
        • 同じトピックのすべてのejsファイル
      • その他のファイル(htmlおよびその他のejs)
    • appjs
    • packagejson
    • パッケージ-lockjson



const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');

const app = express(); 

// Body Parser Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

// engine
app.set("view engine", "ejs");

// Set static path
app.use(express.static(path.join(__dirname, 'public')));

const fs = require('fs');

function renderStatic(dir) {
    return function(req, res, next) {
        let target = path.join(dir, req.path);
        fs.access(target, fs.constants.R_OK, function(err) {
            if (err) {
                // file not found, just move on
                next();
            } else {
                res.render(target);
            }
        });
    }
}

app.use(renderStatic(path.join(__dirname, "views/programmingPublic")));

以下は私のサイドメニューのフォーマットです:(これらのファイルはすべて "programmingPublic"フォルダー内にあります)

<a href="/programming" class="title">Programming</a>
<li><a href="/c">C</a></li>
<li><a href="/cpp">C++</a></li>
<li><a href="/python">Python</a></li>
<li><a href="/javascript">JavaScript</a></li>
<li><a href="/php">PHP</a></li>
jfriend00

を呼び出す必要があるページがたくさんあるが、res.render()各レンダリングにカスタムオプションを渡していない場合は、それらすべてのテンプレートを独自のディレクトリに分離してから、次のようなミドルウェアを使用できます。

const path = require('path');
const fs = require('fs');

function renderStatic(dir, options) {
    const regex = /^\.|\.\.|\/\.|\\\./;
    options = options || {};

    return function(req, res, next) {
        let target = path.join(dir, req.path);
        if (options.ext && !path.extname(target)) {
           target = target + options.ext;
        }
        // don't allow leading dot or double dot anywhere in the path
        if (regex.test(target)) {
           next();
           return;
        }
        fs.access(target, fs.constants.R_OK, function(err) {
            if (err) {
                // file not found, just move on
                next();
            } else {
                res.render(target);
            }
        });
    }
}

app.use(renderStatic(path.join(__dirname, "renderPublic"), {ext: ".ejs"}));

他のファイルがそこに見つからないように、これらのテンプレートファイルを独自のディレクトリに分離する必要があることに注意してください。

安全性の完全を期すため、このコードはまた、フィルタリングする必要がある...のようなパスに項目をexpress.static()レンダリングする静的なディレクトリ内以外のファイルへのアクセスを得るためにあなたのディレクトリ階層を上がってから攻撃を防ぐために行います。


次に、使用しているルートでres.sendFile()他のロジックがない場合は、それらのHTMLファイルを独自のディレクトリに分離し、そのディレクトリをポイントexpress.static()します。次に、express.static()ミドルウェアはそのディレクトリで一致するHTMLファイルを見つけてres.sendFile()、CSSファイルの場合とまったく同じように自動的に実行します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Laravel5.1でEntrustミドルウェアを使用する場合の例外

分類Dev

OWINミドルウェアの使用例

分類Dev

1つのミドルウェアexpressjsrestfulapiの多くの関数

分類Dev

多くのミドルウェア機能でのhttprouterパス

分類Dev

角度7のミドルウェア?

分類Dev

Masstransit発行のミドルウェア

分類Dev

ミドルウェア形式の応答

分類Dev

Express 4:ミドルウェアの分岐

分類Dev

boot()のPHPlaravelミドルウェア

分類Dev

goLangでjulienschmidt / httprouterを使用する場合のミドルウェアの使用方法

分類Dev

SlimFrameworkの特定のルートにミドルウェアを追加する方法

分類Dev

Laravelのルートに2つのミドルウェアを適用する

分類Dev

静的アセットを除くすべてのルートでミドルウェアを実行する方法

分類Dev

Expressで生のミドルウェアを使用する方法

分類Dev

ラックミドルウェアのラックミドルウェア?

分類Dev

ルートのミドルウェアをテストする方法は?

分類Dev

高速ルートですべてのミドルウェアを処理する

分類Dev

Laravel 5:ルートへの前後のミドルウェア

分類Dev

複数のミドルウェアのLaravelルート

分類Dev

ASP.NETIDなしでCookieミドルウェアを使用する場合のカスタムIsInRole()

分類Dev

ミドルウェアgo-chi内のルートを取得する方法

分類Dev

Laravelルートに複数のミドルウェアを追加する

分類Dev

Laravelルートに複数のミドルウェアを追加する

分類Dev

Laravelルートに複数のミドルウェアを追加する

分類Dev

Laravelのミドルウェアでルートを取得する方法

分類Dev

Laravelのミドルウェアでルートを保護する方法は?

分類Dev

Laravel> = 5.2.31のルートでWebミドルウェアを回避/削除する

分類Dev

認証ミドルウェアからの単一ルートを除くLaravel

分類Dev

ミドルウェアのスタブアウト

Related 関連記事

  1. 1

    Laravel5.1でEntrustミドルウェアを使用する場合の例外

  2. 2

    OWINミドルウェアの使用例

  3. 3

    1つのミドルウェアexpressjsrestfulapiの多くの関数

  4. 4

    多くのミドルウェア機能でのhttprouterパス

  5. 5

    角度7のミドルウェア?

  6. 6

    Masstransit発行のミドルウェア

  7. 7

    ミドルウェア形式の応答

  8. 8

    Express 4:ミドルウェアの分岐

  9. 9

    boot()のPHPlaravelミドルウェア

  10. 10

    goLangでjulienschmidt / httprouterを使用する場合のミドルウェアの使用方法

  11. 11

    SlimFrameworkの特定のルートにミドルウェアを追加する方法

  12. 12

    Laravelのルートに2つのミドルウェアを適用する

  13. 13

    静的アセットを除くすべてのルートでミドルウェアを実行する方法

  14. 14

    Expressで生のミドルウェアを使用する方法

  15. 15

    ラックミドルウェアのラックミドルウェア?

  16. 16

    ルートのミドルウェアをテストする方法は?

  17. 17

    高速ルートですべてのミドルウェアを処理する

  18. 18

    Laravel 5:ルートへの前後のミドルウェア

  19. 19

    複数のミドルウェアのLaravelルート

  20. 20

    ASP.NETIDなしでCookieミドルウェアを使用する場合のカスタムIsInRole()

  21. 21

    ミドルウェアgo-chi内のルートを取得する方法

  22. 22

    Laravelルートに複数のミドルウェアを追加する

  23. 23

    Laravelルートに複数のミドルウェアを追加する

  24. 24

    Laravelルートに複数のミドルウェアを追加する

  25. 25

    Laravelのミドルウェアでルートを取得する方法

  26. 26

    Laravelのミドルウェアでルートを保護する方法は?

  27. 27

    Laravel> = 5.2.31のルートでWebミドルウェアを回避/削除する

  28. 28

    認証ミドルウェアからの単一ルートを除くLaravel

  29. 29

    ミドルウェアのスタブアウト

ホットタグ

アーカイブ