web-dev-qa-db-ja.com

nodejsサーバーにキャッシュがありません

Nodejsでのキャッシュを回避するために、以下を使用する必要があることを読みました:

"res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');"

しかし、コードにその行を挿入するとエラーが発生するため、使用方法がわかりません。

私の機能(私がキャッシュをプログラムする必要がないと思うところ)は:

function getFile(localPath, mimeType, res) {
        fs.readFile(localPath, function(err, contents) {
                if (!err) {
                    res.writeHead(200, {
                    "Content-Type": mimeType,
                    "Content-Length": contents.length,
                'Accept-Ranges': 'bytes',
                    });
                //res.header('Cache-Control', 'no-cache');
                    res.end(contents);
                } else {
                    res.writeHead(500);
                    res.end();
                }
        });

}

誰も私のコードにキャッシュを入れない方法を知っていますか?ありがとう

41
user2986808

ヘッダーはすでに作成済みです。あなたがそれをした後でそれ以上追加することはできないと思いますので、最初のオブジェクトにヘッダーを入れてください。

res.writeHead(200, {
  'Content-Type': mimeType,
  'Content-Length': contents.length,
  'Accept-Ranges': 'bytes',
  'Cache-Control': 'no-cache'
});
30
Brad

ミドルウェアを利用してno-cacheヘッダーを追加します。このミドルウェアは、キャッシュをオフにする予定のある場所ならどこでも使用できます。

function nocache(req, res, next) {
  res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
  res.header('Expires', '-1');
  res.header('Pragma', 'no-cache');
  next();
}

ルート定義でミドルウェアを使用します。

app.get('/getfile', nocache, sendContent);

function sendContent(req, res) {
  var localPath = 'some-file';
  var mimeType = '';
  fs.readFile(localPath, 'utf8', function (err, contents) {
    if (!err && contents) {
      res.header('Content-Type', mimeType);
      res.header('Content-Length', contents.length);
      res.end(contents);
    } else {
      res.writeHead(500);
      res.end();
    }
  });
}

これで問題が解決するかどうかお知らせください。

141
vmx

応答にこれらのヘッダーを設定します。

'Cache-Control': 'private, no-cache, no-store, must-revalidate'
'Expires': '-1'
'Pragma': 'no-cache'

Expressを使用する場合は、このミドルウェアを追加して、すべてのリクエストにキャッシュを設定しないようにすることができます。

// var app = express()
app.use(function (req, res, next) {
    res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
    res.header('Expires', '-1');
    res.header('Pragma', 'no-cache');
    next()
});
49
Pylinux

nocacheミドルウェアを使用して、キャッシュをオフにすることができます。

npm install --save nocache

ミドルウェアをアプリに適用する

const nocache = require('nocache');
...
app.use(nocache());

これにより、ブラウザのキャッシュが無効になります。

5

Pylinuxの答えは私には役に立ちましたが、さらに調べたところ、他のいくつかのセキュリティ機能を処理するExpress用のヘルメットモジュールが見つかりました。

http://webapplog.com/express-js-security-tips/

使用するには、express.jsでヘルメットをインストールして要求し、次にapp.use(helmet.noCache());を呼び出します

1
bmw15

Expressおよびfreshモジュールのソースコードを調べた後、これはサーバー側から機能します(res.endが呼び出される前):

req.headers['if-modified-since'] = undefined;
req.headers['if-none-match'] = undefined;

厄介ですが、動作します。

0
Dale Anderson