2013-12-06 4 views
20

я прочитал, что, чтобы избежать кэш 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(); 
       } 
     }); 

} 

Кто-нибудь знает, как не положил никакого кэша в моем коде? спасибо

+1

Используйте [ 'res.header()'] (http://expressjs.com/api.html# res.set) (и/или ['res.setHeader()'] (http://nodejs.org/api/http.html#http_response_setheader_name_value)) до ['res.writeHead()'] (http: // nodejs.org/api/http.html#http_response_writehead_statuscode_reasonphrase_headers), если вы хотите их смешивать. 'writeHead()' является окончательным, поэтому после него нельзя добавлять дополнительные заголовки. –

+0

привет спасибо .. Я пытался поставить res.header() раньше, но у меня была ошибка. С другой стороны res.setHeader работает – user2986808

ответ

14

Вы уже писали свои заголовки. Я не думаю, что вы можете добавить больше после того, как вы это сделали, так что просто поместите свои заголовки в свой первый объект.

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

Спасибо ... кажется, что нет ошибки .... – user2986808

97

Использовать промежуточное программное обеспечение для добавления 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(); 
    } 
    }); 
} 

Позвольте мне знать, если это работает для вас.

+0

Он не использует Express. – Brad

+0

Привет, vmx ... спасибо, но Брэд прав Я не использую Express, и я думаю, что ваш ответ полезен, используя только Express ... – user2986808

+1

Хорошо, даже если вы не используете экспресс, то, что по существу необходимо, установить заголовки nocache , Я добавляю заголовки в многоразовое промежуточное ПО, иначе вы можете установить эти заголовки любым способом, который работает. – vmx

27

Установите эти заголовки на ваш ответ:

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

При использовании экспресса вы можете добавить промежуточное программное обеспечение, не имеет кэша на всех запросах:

// 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() 
}); 
+0

Спасибо, что были краткими и совершенными, только то, что мне нужно. :) – Bharat

+0

Я пробовал это с res.redirect -> он, похоже, не работает в Chrome версии 61.0.3163.100 router.get ('/ logout', function (req, res) { \t res.cookie (' jwtToken ',' ', {expires: new Date (0)}); \t res.header (' Cache-Control ',' private, no-cache, no-store, must-revalidate '); \t res. заголовок ('Expires', '-1'); res.header ('Pragma', 'no-cache'); \t res.redirect ('/ vendor/login'); }); любая идея, чего я здесь не хватает. – j10

0

После спелеология через исходный код для экспресса и свежие модули, это работает со стороны сервера (до вызова RES.END):

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

Неприятный, но он работает.

1

Ответ Pylinux работал для меня, но после дальнейшего осмотра я нашел модуль шлема для экспресс, который обрабатывает некоторые другие функции безопасности для вас.

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

Для использования, установки и требуют шлем в express.js, а затем вызвать app.use(helmet.noCache());

Смежные вопросы