2013-07-01 7 views
5

私は、バックエンド用にExpressを使用し、フロントエンド用にAngularJSを使用して単一ページアプリケーションを構築しています。Express - 特定のファイルに対して異なるmaxAgeを設定する

私はエクスプレスビューを使用していません。express.staticミドルウェアのファイルのみを提供しています。

私の静的ファイルは、環境に応じてpublic/appまたはpublic/distです(distはファイルを縮小しました)。

app.use app.router 
app.use express.static(cwd + '/public/' + publicFolder, maxAge: MAX_AGE) 

「/」を要求する場合、ユーザーがログインしている場合、app.routerは検証し、すべてがOKであれば、その後index.htmlは(私はちょうどコントローラでnext()を呼び出す)express.staticを経由して提供しています。ユーザがログインしていない場合、それは私の問題は、私はMAXAGEを設定した場合、私のindex.htmlファイルがキャッシュされますと、最初の要求は、「/」routerを経由しないためにということですlogin.html

にリダイレクトされます。私はログインしていなくてもアプリケーションに入ることができます。

maxAgeを0に設定すると問題はなくなりますが、すべての* .jsと* .cssファイルをキャッシュします。

この種の問題に対する正しいアプローチは何ですか?ビューの使用を開始しますか?異なるexpress.staticマウントポイントですか?

+0

非常に重要な問題。このトピックについて、どれくらい多くの人が頭を壊しているのか想像できます。良い説明をありがとう。 – zeliboba

答えて

4

ビューを使用せずに(ビューテンプレートは悪い考えではありませんが)、いつでも個々のルートを定義できます。このように特殊なケースmaxAgeを適用するだけでindex.htmlを定義することができます。

の前に、の静的ミドルウェアを置くようにしてください。

sendを使用したい場合は、staticミドルウェアがバックグラウンドで使用するのと同じ静的サーバーを使用することもできます。以下のような何か:

// install send from npm 
var send = require("send"); 

app.get("/index.html", function (req, res) { 
    send(req, "/index.html") 
    .maxage(0) 
    .root(__dirname + "/public") 
    .pipe(res); 
}); 

以上の低レベルのストリームの道、のようなもの:はるかに大きな声で必要

app.get("/index.html", function (req, res) { 
    res.setHeader('Content-Type', 'text/html'); 
    res.setHeader('Cache-Control', 'public, max-age=0'); 

    // Note that you'd probably want to stat the file for `content-length` 
    // as well. This is just an example. 

    var stream = fs.createReadStream(__dirname + '/public/index.html'); 
    stream.pipe(res); 
});