web-dev-qa-db-fra.com

res.redirect ('retour') avec paramètres

J'ai un formulaire d'inscription sur chaque page de mon site Web. Pendant l'enregistrement, une erreur peut se produire. Après avoir attrapé l'erreur, je dois retourner l'utilisateur à la page précédente, affichant un message d'erreur. Le problème est que je ne sais pas à partir de quelle page l'utilisateur a effectué l'enregistrement, donc j'utilise res.redirect('back');. Cependant, je ne peux pas simplement rediriger l'utilisateur, je dois également afficher le message d'erreur, donc je dois passer un argument. Mais res.redirect('back', (reg_error:'username')}) ne peut pas être utilisé directement car res.redirect() ne prend pas en charge les paramètres. Comment rendre la page précédente avec un paramètre?

42
f1nn

L'utilisation de l'en-tête du référent pour trouver la page d'origine de votre utilisateur peut être utile:

app.get('/mobileon', function(req, res){
  backURL=req.header('Referer') || '/';
  // do your thang
  res.redirect(backURL);
});

Vous pouvez également vouloir stocker backURL dans req.session, si vous en avez besoin pour persister sur plusieurs routes. N'oubliez pas de tester l'existence de cette variable, quelque chose comme: res.redirect(req.session.backURL || '/')


edit: Puisque ma réponse a obtenu des votes positifs, j'ai tapé ma façon actuelle de le faire. Il est devenu un peu long, vous pouvez donc le consulter sur https://Gist.github.com/therealplato/7997908 .

La différence la plus importante est l'utilisation d'un paramètre explicite de "rebond" dans la chaîne de requête qui remplace l'URL du référent.

40
Plato

Un moyen très simple de l'implémenter est d'utiliser connect-flash , un middleware pour express qui exploite le middleware de session intégré à express pour passer des messages 'flash' à la prochaine requête.

Cela signifie que vous n'avez pas besoin d'ajouter des champs pour suivre les URL ou les messages dans le formulaire ou les modèles d'itinéraire pour vos vues.

Il fournit une version simple de même fonctionnalité dans Ruby on Rails .

(évidemment, vous devez utiliser le framework Express pour cela, mais je le recommande fortement aussi!)

Branchez-le comme ceci:

var flash = require('connect-flash');
var app = express();

app.configure(function() {
  app.use(express.cookieParser('keyboard cat'));
  app.use(express.session({ cookie: { maxAge: 60000 }}));
  app.use(flash());
});

Et puis utilisez-le comme ceci:

app.get('/flash', function(req, res){
  req.flash('info', 'Flashed message')
  res.redirect('/');
});

app.get('/', function(req, res){
  res.render('index', { message: req.flash('info') });
});
27
Jed Watson

Si vous utilisez des sessions, vous pouvez simplement ajouter que reg_error s'oppose à req.session objet avant votre redirection. Il sera ensuite disponible sur le req.session objet lorsque vous chargez la page précédente.

5
danmactough

Vous pouvez simplement le rediriger en tant que res.redirect('..?error=1')

le ? tag indique au navigateur qu'il s'agit d'un ensemble de paramètres facultatifs et que le .. n'est qu'un rappel relatif de chemin d'accès (comme appeler cd .. sur le terminal pour reculer d'un répertoire) et votre navigateur vous dirigera vers la page appropriée avec cette balise à la fin: http://.....?error=1

alors vous pouvez simplement extraire l'erreur sur la page appropriée en faisant:

if (req.param("error" == 1)) { 
// do stuff bassed off that error match
};

vous pouvez coder en dur plusieurs valeurs d'erreur différentes et le faire répondre de manière appropriée en fonction de l'erreur qui s'est produite

Notez que cela rend votre page Web susceptible d'être manipulée, car les utilisateurs peuvent saisir leurs propres paramètres et obtenir que votre page y réponde, alors assurez-vous que l'action que vous prenez n'est pas quelque chose que vous ne voudriez pas que les gens abusent. (Cela devrait convenir pour une simple erreur d'affichage)

5
gadu