2013-04-18 9 views
7

Mam ten fragment kodu tutaj:służyć plików statycznych i konflikt app.get pomocą Express.js

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

var app = express(); 
var server = app.listen(1344); 
var io = require('socket.io').listen(server); 


app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 


app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 

}); 

Kod wewnątrz app.get() zwrotnego nie jest wywoływana. Jeśli skomentuję linię app.use(express.static(__dirname + '/public')), działa funkcja Callaback. Próbowałem zmienić kolejność, ale to jest jak loteria! Wolałbym wiedzieć, co tu jest nie tak.

Jestem pewien, że ma to związek z brakiem wiedzy z mojej strony na temat tego, jak nazywa się oprogramowanie pośredniczące. Czy ktoś może mi pomóc zrozumieć ten problem?

Zasadniczo po prostu chcę wykonać trochę logiki, zanim pliki zostaną wyświetlone, a index.html zostanie załadowany do przeglądarki. Przy okazji umieszczenie linii app.get() przed linią app.use(express.static()) nie rozwiązało problemu!

+1

Czy masz plik public/index.html? –

+0

Tak, mam ..... – limoragni

+2

Dlatego jest uszkodzony. Usuń go i wszystko będzie działać. Może istnieć opcja "dir" do wyłączania indeksów dla folderów, ale nie jestem pewien –

Odpowiedz

5

Twoje oprogramowanie do obsługi plików statycznych powinno być uruchamiane jako pierwsze.

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 

Powinieneś również dodać użycie dla app.router.

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 
app.use(app.router); 

Oprogramowanie pośrednie przetwarzane jest dla każdego żądania. Jeśli więc masz pliki statyczne index.html, żądania yourdomain.com/ nigdy nie zostaną przesłane do app.router, ponieważ zostaną dostarczone przez obsługę plików statycznych. Usuń index.html, a następnie ta prośba przepłynie do twojego app.router.

+0

Dzięki za odpowiedź. Ale jeśli użyjesz mddleware w tej kolejności przy użyciu app.router, pliki nie zostaną wyświetlone. Zostanie wyzwolony kod wewnątrz app.get(). Chcę wykonać zarówno wyświetlanie plików, jak i kod wewnątrz app.get(). – limoragni

+0

Statyczne oprogramowanie pośredniczące powinno być zawsze pierwszym, ponieważ nie ma potrzeby instalowania oprogramowania pośredniego nad nim. Na przykład parsowanie plików cookie, konfigurowanie sesji lub uwierzytelnianie użytkowników dla zasobów statycznych jest dość głupie. –

+0

Ok ... Rozumiem. Nie używam poprawnego użycia plików statystycznych. Zaczynam to sobie uświadamiać. Myślę o usunięciu pliku index.html i renderowaniu tego pliku po stronie serwera. Czy to jest właściwy sposób na zrobienie tego? – limoragni

3

Zmień nazwę pliku index.html na coś innego. To jest takie proste

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

app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 
    res.sendfile(new_index_file); 
}); 
0

wierzę, masz 3 możliwości:

1) Mount trasy app.get('/') (ewentualnie przy użyciu app.router) przed middleware statyczny, tak że one mają pierwszeństwo. Oprogramowanie pośrednie, które jest instalowane jako pierwsze, najpierw przetwarza zgodne żądanie.

2) Użyj przedrostek ścieżki dla statycznych ścieżek jak app.use('/static', express.static('public'));, tak że statyka serwowane jest od example.com/static/...

3) Chcesz działać elegancki i strzelać sobie w nogę? :) Czasami ludzie używają nagłówków Accept i negocjacji treści do obsługi 2 różnych typów treści z tego samego adresu URL w różnych okolicznościach. Możesz dokonać statycznego sprawdzenia oprogramowania pośredniego pod kątem określonego typu zawartości w nagłówku i żądaniu procesu w nagłówku Accept, tylko jeśli żądany nagłówek żądania żąda odpowiedniego typu. W przeciwnym razie przekaże przetwarzanie w dół strumienia do widoku /. Możesz dostosować swoją statyczną negocjację treści oprogramowania pośredniego pod numerem req.accepts.

Powiązane problemy