web-dev-qa-db-fra.com

Node.js avec Express: comment rediriger une POST

Je souhaite rediriger d'une demande d'URL vers une autre demande "POST", comme ceci:

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

Cependant, je ne peux pas rediriger vers la page '/ test' car c'est une demande POST.
Alors, que dois-je faire pour que la redirection fonctionne, en conservant la requête '/ test' POST?

19
neolicd

Tu peux le faire:

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

Ce qui préservera la méthode d'envoi.

Pour référence, la spécification de code http 307 est:

307 Redirection temporaire (depuis HTTP/1.1) Dans ce cas, la demande doit être répétée avec un autre URI, mais les demandes futures peuvent toujours utiliser l'URI d'origine.2 Contrairement à 303, la méthode de demande ne doit pas être modifiée lors de la réémission de la demande d'origine . Par exemple, une demande POST doit être répétée en utilisant une autre demande POST.

Pour plus d'informations, voir: http://www.alanflavell.org.uk/www/post-redirect.html

33
ldg

Gardez à l'esprit l'architecture du middleware: chaque gestionnaire peut manipuler le contexte et répondre - ou - appeler next().

Par cette prémisse, le routeur express est essentiellement une fonction middleware que vous pouvez utiliser après avoir "corrigé" l'url.

(BTW, l'application de demande est également une fonction, bien que je ne sois pas sûr de recommander de revenir si tôt dans la chaîne)

Voici un exemple:

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
)
2
Radagast the Brown

La seule différence entre 307 et 302 est que 307 garantit que la méthode et le corps ne seront pas modifiés lors de la demande redirigée.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307

0
pshx