1

しばらくの間SOを使用してきましたが、この特定の問題の解決策が見つからなかったため、ここでの最初の質問です。できるだけ明確にするように努めますが、不明な点がある場合はお知らせください。それに応じて質問を更新します。

ルートを使用して、パラメーター()としてルートに渡されたuserIdに従ってユーザーの写真を提供しています。これは機能しますが、タグが検出されるたびにサーバーに画像を要求し、キャッシュされたバージョンを使用することはありません。

Cache-Controlで少し遊んだのですが、それはすべてかゼロかです。キャッシュが有効になっていて、ユーザーが写真を変更した場合でも、古い写真が使用されます。

私の質問は、写真が変更されていない場合はキャッシュされたバージョンを使用できますが、サーバーからのものを使用した場合は使用できますか?「max-age」または「no-cache」と一緒に「must-revalidate」を使用してみましたが、役に立ちませんでした。

役立つ場合のルートコードは次のとおりです。

Module.exports.getPhoto = function(req, res) {
    var mime = require('mime-magic'),
        memberId = req.params.memberId,
        imgUrl;

    path.exists('public/images/memberPhotos/' + memberId, function(exists) {
        if(exists) {
            imgUrl = 'public/images/memberPhotos/' + memberId;
        }else{
            imgUrl = 'public/images/memberPhotos/noPhoto.jpg';
        }

        fs.readFile(imgUrl, function(err, img) {
            mime.fileWrapper(imgUrl, function(err, mimeType) {
                if(!err) {
                    console.log(mimeType);
                    res.writeHead(200, {
                        'Content-Type': mimeType,
                        'Cache-Control': "max-age=" + 43800*60 + ", must-revalidate"
                    });
                    res.end(img, 'binary'); 
                }
            });

        });
    });
};

ありがとう

4

1 に答える 1

1

ETagIf-None-Matchヘッダーを使用します。サーバー上の画像のETagを追跡する必要があります。着信If-None-Matchが現在のETagと一致する場合は、304-変更なしでリクエストに応答します。それ以外の場合は、画像を提供し、ヘッダーに新しいETagを含めます。

詳細については、 http://blog.phyber.com/supporting-cache-controls-in-nodejsを参照してください。

于 2012-06-05T15:57:06.113 に答える