4

node.js で Express を使用する場合、パブリック リソースのキャッシュ ヘッダーを次のように制御できます。

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));

これにより、パブリック フォルダーの下にあるすべてのものが静的に利用可能になり、キャッシュ タイムアウトは 1 年間になります。しかし、公開されている他のファイルに別のタイムアウト値を設定したい場合はどうすればよいでしょうか? public/images/icons の下に、1 年よりも小さい値にしたい画像があるとしますか? 次のように static への2番目の呼び出しを追加してみました:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));

しかし、うまくいきませんでした。2番目のステートメントを無視しているようです。考え?

4

3 に答える 3

5

Expressはミドルウェアを順番にテストするため、最も具体的なexpress.static呼び出しを最初に配置すると、機能するはずです。

app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
app.use(express.static(path.join(__dirname, 'public/images'), { maxAge: 1234567 }));
app.use(express.static(path.join(__dirname, 'public/else'), { maxAge: 9874567 }));
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));

編集:

これはパスを維持しないので、私はします

function static(dirname, age) {
    return express.static(path.join(__dirname, dirname), { maxAge: age });
}

その後、電話します

app.use('/public/images/icons', static('public/images/icons', 12345));
app.use('/public/images/', static('public/images', 1234567);

この背後にある理由は、以前のソリューションではすべての静的ファイルがルートにマウントされるのに対し、このソリューションでは各ディレクトリが正しいmaxAgeでそのファイルパスにマウントされるためです。

于 2013-03-15T18:02:06.807 に答える
1

静的ミドルウェアのソース コードは、URL のパス部分からファイルパスのように見えるものを傍受し、構成されたルート ディレクトリからファイルを統計し、存在する場合はそれを提供することを示しています。

通常のミドルウェアで maxAge オプションを変更する可能性はありません。

私が提案するのは、独自のミドルウェア (関数のみ) を作成し、(ディレクトリごとに) 適切な数の静的ミドルウェアを作成し、req, res, nextパラメーターを正しいものに転送することです。

于 2013-03-15T16:19:18.323 に答える