Node.js con Express: come redirect una richiesta POST

Voglio redirect da una richiesta URL a un’altra richiesta ‘POST’, come questa:

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'); }); 

Tuttavia, non posso redirect alla pagina ‘/ test’ perché è una richiesta POST.
Quindi cosa dovrei fare per rendere il reindirizzamento funzionante, mantenendo la richiesta POST ‘/ test’?

Puoi farlo:

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

Che manterrà il metodo di invio.

Come riferimento, le specifiche del codice http 307 sono:

307 Reindirizzamento temporaneo (da HTTP / 1.1) In questa occasione, la richiesta deve essere ripetuta con un altro URI, ma le richieste future possono ancora utilizzare l’URI originale.2 Contrariamente a 303, il metodo di richiesta non deve essere modificato quando si effettua nuovamente la richiesta originale . Ad esempio, una richiesta POST deve essere ripetuta utilizzando un’altra richiesta POST.

Per maggiori informazioni, consultare: http://www.alanflavell.org.uk/www/post-redirect.html

Tieni presente l’architettura del middleware: ogni gestore può manipolare il contesto e rispondere o – call next() .

Con questa premessa, il router express è fondamentalmente una funzione middleware che è ansible utilizzare dopo aver “corretto” l’url.

(A proposito, l’app di richiesta è anche una funzione, anche se non sono sicuro se consiglio di tornare così presto nella catena)

Ecco un esempio di un esempio:

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