2012-07-13 8 views
9

Jestem względnie nowym użytkownikiem oprogramowania node.js, Express i aplikacji mobilnych i napotkałem problem, który, jak sądzę, ma związek z wysyłaniem nagłówków za pomocą Express.Nagłówki nie ustawiają się z przekierowaniem za pomocą pliku node.js/Express

Użytkownik zaczyna na stronie głównej "/", a nie zalogowany, a następnie klika przycisk, aby przejść do strony logowania. Kiedy złożyć swoją nazwę użytkownika i hasło „/ validate_signin”, powinny one zostać przekierowany z powrotem do strony głównej, tym razem na stronie głównej pokazuje się inaczej, ponieważ są one rejestrowane w

Przekierowanie działało tak:.

res.redirect('/'); 

Działa to dobrze na moim laptopie, ale na moim telefonie komórkowym przekierowuje do "/", w swoim starym stanie, prawdopodobnie z powodu buforowania. Jeśli odświeżę stronę w telefonie, "/" wyświetli się tak, jak powinno.

Znalazłem ten post: How to control web page caching, across all browsers?

próbowało ustawić nagłówki w dwóch następujących sposobów (oddzielnie), ale nie wydają się być wysyłania:

res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
res.header("Pragma", "no-cache"); 
res.header("Expires", 0); 

res.writeHead(302, { 
    "location": "/", 
    "Cache-Control" : "no-cache, no-store, must-revalidate", 
    "Pragma": "no-cache", 
    "Expires": 0 
}); 

Oto nagłówki które aktualnie otrzymuję:

HTTP/1.1 304 Not Modified 
X-Powered-By: Express 
Date: Fri, 13 Jul 2012 17:35:18 GMT 
Cache-Control: public, max-age=0 
Last-Modified: Fri, 13 Jul 2012 12:32:12 GMT 
Etag: "3223-1342182732000" 
Accept-Ranges: bytes 
Connection: keep-alive 

Jakieś pomysły?

Wielkie dzięki.

+1

Te nagłówki powinny być zapisane na stronie, której nie chcesz buforować ('/'), a nie na stronie, na której przekierowujesz, prawda? –

+0

Prawidłowe. Tak, prawdopodobnie umieszczam je w niewłaściwym miejscu. Idę o to popatrzeć. –

+0

Twój problem nie dotyczy buforowania przeglądarki. Z jakiegoś powodu Express przesyła 304 zamiast rzeczywistego przekierowania, a przeglądarka odpowiada odpowiednio (tzn. Zachowując starą wersję). To brzmi jak jakieś wewnętrzne buforowanie wykonywane przez Express; czy przypadkiem używasz express.static do obsługi danej strony? – ebohlman

Odpowiedz

10

Chciałbym komentować, ale właśnie dołączyłem dzisiaj i nie mam żadnych punktów reputacji.

Jeśli dobrze rozumiem, podajesz stronę za pomocą express.static (więc jest to zwykła strona HTML), ale jeśli użytkownik jest zalogowany, używasz routera Express, czy mam rację?

Zgaduję również, że wpisałeś wspomniany kod, aby ustawić nagłówki na trasie strony głównej.

Jeśli tak jest, problem nie polega na buforowaniu przeglądarki, występuje z powodu charakteru middleware.

Middlewares wykonuje się w łańcuchu, wywołując kolejne, gdy są gotowe, co oznacza, że ​​jeśli założę się poprawnie, express.static zostanie wywołany przed routerem i po prostu wyświetli statyczną stronę HTML.

Twoja trasa nigdy nie zostanie wykonana, ponieważ express.static nie zadzwoni pod numer next() (z oczywistych powodów plik istnieje).

Mam nadzieję, że zakładam, że jest prawdą.


Edit:

Wygląda na to, że zakłada się źle. Powiedziałeś, że działa dobrze na twoim laptopie, więc zdecydowanie wygląda na problem z buforowaniem po stronie klienta.

Nadal nie jestem pewien, jak dokładnie wyświetlasz inną stronę domową za pomocą funkcji express.static() lub gdzie umieściłeś kod, o którym wspomniałeś powyżej, zamierzam zrobić zdjęcie bez wyświetlania kodu, ale może to być potrzebne dla mnie i innych, aby ci pomóc.

Te nagłówki odpowiedzi należy ustawić w pierwszej odpowiedzi (podczas odwiedzania strony głównej), nie ma to nic wspólnego z przekierowaniem. Odłóżmy teraz część przekierowania na bok.

napisałem krótki (wyrazić) Przykład:

var express = require('express'), 
    http = require('http') 
    app = express(); 

app.configure(function() { 
    app.set('port', process.env.PORT || 3000); 
    app.use(express.logger('dev')); 

    /* 
    * Here's where I set the headers, make sure it's above `express.static()`. 
    * 
    * Note: You can safely ignore the rest of the code, (it's pretty much "stock"). 
    */ 
    app.use(function noCachePlease(req, res, next) { 
    if (req.url === '/') { 
     res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
     res.header("Pragma", "no-cache"); 
     res.header("Expires", 0); 
    } 

    next(); 
    }); 

    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on port " + app.get('port')); 
}); 

Ten kod instruuje przeglądarkę nie buforować stronę.

Nagłówki odpowiedzi dostaję bez z noCachePlease middleware:

Accept-Ranges bytes 
Cache-Control public, max-age=0 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:25:38 GMT 
Etag "5-1342811956000" 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
X-Powered-By Express 

nagłówki odpowiedzi dostaję znoCachePlease middleware:

Accept-Ranges bytes 
Cache-Control no-cache, no-store, must-revalidate 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:26:08 GMT 
Etag "5-1342811956000" 
Expires 0 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
Pragma no-cache 
X-Powered-By Express 

Więc jak widać, to działa ale sam możesz uruchomić ten kod.

Jeśli chcesz go uruchomić, musisz mieć express pod node_modules lub zainstalować globalnie (z flagą -g).

+0

Dziękuję za odpowiedź/komentarz.Tak faktycznie używam express.static dla obu przypadkach.Jeśli strona ładuje (a nie tylko jest pobierana z pamięci podręcznej), powinna wykonać połączenie do "/ issignedin /" przez ajax, i na tej podstawie javascript załaduje odpowiedni układ strony.Tutaj możesz zobaczyć stronę: http://184.73.213.206:8080/ –

+0

@Nathan Moje przypuszczenie było nieprawidłowe. Z pewnością moja zaktualizowana odpowiedź (z działającym przykładem) byłaby pomocna.Jeśli nadal nie jest to możliwe, może powinieneś opublikować odpowiednie części swojego kodu (prawdopodobnie middleware i trasy) – samitny

+0

Dziękuję za świetny przykład. Myślałem, że to zadziała , ale otrzymuję tę samą odpowiedź, nawet po wyczyszczeniu pamięci podręcznej przeglądarki i ponownej próbie.) Zajmę się tym nieco dalej, a następnie opublikuję mój kod. Jeszcze raz dziękuję –

Powiązane problemy