2016-08-07 20 views
5

Chcę przekierowanie z jednego żądania URL do innego wniosku 'post', podobnie jak to:
node.js z Express: jak przekierować żądania POST

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

 
app.get('/', function(req, res) { 
 
    res.redirect('/test'); 
 
}); 
 

 
app.post('/test', function(req, res) { 
 
    res.send('/test page'); 
 
}); 
 

 
app.listen(3000, function() { 
 
    console.log('listenning on port:3000'); 
 
});

Jednak ja nie można przekierować na stronę "/ test", ponieważ jest to żądanie POST.
Co należy zrobić, aby przekierowanie działało, zachowując POST żądania "/ test"?

+0

I jestem trochę zdezorientowany terminem "strona" czy szukasz przekierowania z jednego punktu końcowego na inny? Przykład '/' {} żądanie GET '/ test' {POST} –

+0

przepraszam za zamieszanie. Chodzi mi o to przekierowanie z 'localhost: 3000 /' na 'localhost: 3000/test' – neolicd

Odpowiedz

14

Można to zrobić:

app.post('/', function(req, res) { 
    res.redirect(307, '/test'); 
}); 

Które zachowania metodę wysyłania.

Dla porównania, kod Spec 307 http jest:

307 Temporary Redirect (od HTTP/1.1) W tej okazji wniosek należy powtórzyć z innym URI, ale przyszłe żądania mogą nadal korzystać oryginalny URI.2 W przeciwieństwie do 303, metoda żądania nie powinny być zmieniane podczas reissuing pierwotnego wniosku. Na przykład żądanie POST musi zostać powtórzone przy użyciu innego żądania POST.

Aby uzyskać więcej informacji, zobacz: http://www.alanflavell.org.uk/www/post-redirect.html

+0

dostał. Więc po prostu nie mogę przekierować do app.post ("/ test"), jeśli używam app.get ("/"), prawda? – neolicd

+0

Nie ze standardowym przekierowaniem http, musisz ustawić jakiś rodzaj proxy. – ldg

+1

To rozwiązanie wymusza kolejne żądanie przeglądarki. Serwer instruuje przeglądarkę, a następnie przegląda kolejne żądanie. Jest to metoda ronda. W każdym razie mogę przekierować bezpośrednio do Express, aby uniknąć konieczności przechodzenia do przeglądarki, aby złożyć wniosek? – Koder

0

Pamiętaj architektury middleware: Każdy handler może manipulować kontekst i albo reagują - lub - zadzwoń next().

W tym założeniu, Express Router jest w zasadzie funkcją middleware można stosować po „korygowania” URL.

(BTW, aplikacja prośba jest również funkcja, choć nie jestem pewien, czy polecam wraca tak wcześnie w łańcuchu)

Oto kind'a przykład:

const router = new require('express').Router() 
const user = require('../model/user') 
//assume user implements: 
// user.byId(id) -> Promise<user> 
// user.byMail(email) -> Promise<user> 

const reqUser = userPromise => (req, res, next) => 
    req.user 
    ? next() 
    : userPromise(req) 
     .then(user => { req.user = user }) 
     .then(next, next) 
//assume the sever that uses this router has a 
//standard (err, req, res, next) handler in the end of the chain... 

const byId = reqUser(req => user.byId(req.params.id)) 
const byMail = reqUser(req => user.byMail(req.params.mail)) 

router.post('/by-id/:id/friends', 
    byId, 
    (req, res) => res.render('user-friends', req.user) 
) 

router.post('/by-email/:email/friends', 
    byMail, 
    (req, res, next) => { 
    req.url = `/by-id/${req.user.id}/friends` 
    next() 
    }, 
    router 
)