2013-07-01 4 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을 확인하고, 모든 후 index.htmlexpress.static를 통해 제공됩니다 확인하는 경우 (난 그냥 컨트롤러 next() 전화). 사용자가 로그인하지 않은 경우, 그것은 내 문제는 내가 MAXAGE을 설정하면, 내 index.html 파일이 캐시됩니다 및 첫 번째 요청은 '/'router을 통과하지 않는 것을입니다 login.html

로 리디렉션됩니다. 로그인하지 않아도 입력 할 수 있습니다.

maxAge를 0으로 설정하면 문제가 없어지지만 모든 * .js 및 * .css 파일을 캐시하고 싶습니다.

이러한 종류의 문제에 대한 올바른 접근 방법은 무엇입니까? 보기를 사용 하시겠습니까? 다른 express.static 마운트 포인트가 있습니까?

+0

매우 중요한 문제. 얼마나 많은 사람들이이 주제에 대해 머리를 쓰는지 상상할 수 있습니다. 좋은 설명 주셔서 감사합니다. – zeliboba

답변

4

뷰 템플릿을 사용하지 않고도 항상 개별 경로를 정의 할 수 있습니다 (보기 템플릿은 좋지 않습니다). 이 방법으로 index.html을 정의하면 특별한 경우 maxAge을 적용 할 수 있습니다.

경로를 앞에 넣고 앞에 정적 미들웨어를 넣으십시오.

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); 
}); 
관련 문제