2014-04-28 10 views
7

Rozumiem, że można służyć zawartości statycznej nadekspresję z:Podawanie warunkowe stron internetowych w oparciu o nagłówek "Accept" z wyrażeniem ekspresowym?

app.use(express.static(__dirname + "../../../public_html")); 

Ja jednak staram się mieć wyrazić zmienić prezentację treści dostarcza oparty na „Akceptuj” nagłówek odpowiedzi wysyła ponad . Zwykle żądana treść jest wymagana w formacie JSON za pośrednictwem interfejsu API REST, więc adres URL to: http://blah.com/this/that/item i to działa dobrze.

Chciałbym jednak, aby użytkownicy mogli uzyskać dostęp do tej samej strony z przeglądarki, która wysłałaby coś takiego: Accept:text/html iz tego nagłówka, zobacz stronę z poprawnym formatowaniem (CSS/JS/HTML/itp.), aby przedstawić te same informacje.

Teraz staram się służyć zawartości poprzez:

if (req.accepts("text/html")) { 
    res.sendfile("/", { 
     root: "../../../public_html" 
    }); 
    res.status(200); 
    return; 
} 

Gdzie public_html posiada index.html i względne katalogi z CSS i JS. Nie wyślę tego pliku, kiedy to się skończy, ale pomyślałem, że to będzie dobry początek, a następnie doda zawartość JSON po tym, jak zorientowałem się, jak obsługiwać zawartość statyczną w oparciu o nagłówek Accept.

Czy jest lepszy sposób to zrobić?

Odpowiedz

9

Jesteś na dobrej drodze. Oto piękny example z Express, o używaniu req.accept:

app.use(function(req, res, next){ 
    res.status(404); 

    // respond with html page 
    if (req.accepts('html')) { 
    res.render('404', { url: req.url }); 
    return; 
    } 

    // respond with json 
    if (req.accepts('json')) { 
    res.send({ error: 'Not found' }); 
    return; 
    } 

    // default to plain-text. send() 
    res.type('txt').send('Not found'); 
}); 

Aktualizowanie:

Można użyć res.send wysyłanie plików bez renderowania:

res.set('Content-Type', 'text/html'); 
res.send(new Buffer(fs.readFile(__dirname + 'index.html')); 
+0

Wymagałoby to mnie użyć silnik renderowania chociaż, prawda? A jeśli chcę zamiast tego wyświetlić stronę statyczną html? Mogę być niepoprawny, tylko czytam o tym, jak 'res.render' potrzebuje silnika renderującego, a następnie czytam o' jade' i wymaga on osobnego, osobnego znacznika. – zero298

+0

Zobacz moją edycję powyżej. – dankohn

9

można po prostu użyć res.format zrobić to samo. Przykład z wyraźnymi docs:

res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

    html: function(){ 
    res.send('<p>hey</p>'); 
    }, 

    json: function(){ 
    res.send({ message: 'hey' }); 
    } 
}); 

Możesz przeczytać więcej na ten temat tutaj: http://expressjs.com/en/api.html#res.format

Powiązane problemy