J'utilise express pour créer une application web dans node.js. Ceci est une simplification de ce que j'ai:
var express = require('express');
var jade = require('jade');
var http = require("http");
var app = express();
var server = http.createServer(app);
app.get('/', function(req, res) {
// Prepare the context
res.render('home.jade', context);
});
app.post('/category', function(req, res) {
// Process the data received in req.body
res.redirect('/');
});
Mon problème est le suivant:
Si je trouve que les données envoyées /category
ne sont pas validées, je voudrais passer un contexte supplémentaire à la /
page. Comment pourrais-je faire ça? La redirection ne semble autoriser aucun type de paramètre supplémentaire.
flash
: stackoverflow.com/questions/12442716/…/
page. Il existe une/
route, qui peut être desservie par express, et il existe un modèle de page d'accueil, qui peut être rendu par express. Si vous souhaitez conserver certaines données pour le rendu du modèle de page d'accueil après une redirection, malgré la réponse acceptée, les sessions sont votre ami. Ils vous donnent un magasin de données qui persiste à travers les demandes et les réponses pour les utilisateurs de navigation individuels afin que vous puissiez mettre des données pendant la/category
manipulation, puis les retirer si elles sont là pendant la/
remise.Réponses:
Il existe plusieurs façons de transmettre des données à différents itinéraires. La réponse la plus correcte est, bien sûr, les chaînes de requête. Vous devrez vous assurer que les valeurs sont correctement encodéesURIComponent et decodeURIComponent .
Vous pouvez accrocher cela dans votre autre itinéraire en obtenant les paramètres envoyés à l'aide de
req.query
.Pour une manière plus dynamique, vous pouvez utiliser le
url
module principal pour générer la chaîne de requête pour vous:Donc, si vous souhaitez rediriger toutes les variables de chaîne de requête req, vous pouvez simplement faire
Et si vous utilisez Node> = 7.x, vous pouvez également utiliser le
querystring
module principalUne autre façon de le faire est de configurer quelque chose dans la session. Vous pouvez lire comment le configurer ici , mais définir et accéder aux variables est quelque chose comme ceci:
Et plus tard après la redirection ...
Il y a aussi la possibilité d'utiliser une ancienne fonction d'Express,
req.flash
. Pour ce faire, dans les versions plus récentes d'Express, vous devrez utiliser une autre bibliothèque. Essentiellement, cela vous permet de configurer des variables qui s'afficheront et se réinitialiseront la prochaine fois que vous vous rendrez sur une page. C'est pratique pour montrer les erreurs aux utilisateurs, mais encore une fois, il a été supprimé par défaut. EDIT: Trouvé une bibliothèque qui ajoute cette fonctionnalité.J'espère que cela vous donnera une idée générale de la façon de transmettre des informations dans une application Express.
la source
/
itinéraire principal . Une autre option consiste à appeler la route de publication via AJAX et à stocker les données résultantes dans le stockage local ou quelque chose de similaire.La manière la plus simple que j'ai trouvée pour passer des données entre routeHandlers pour
next()
ne pas avoir besoin de jouer avec la redirection ou les sessions. En option, vous pouvez simplement appeler votrehomeCtrl(req,res)
au lieu denext()
et simplement passer lereq
etres
la source
/
J'ai dû trouver une autre solution car aucune des solutions fournies ne répondait réellement à mes besoins, pour les raisons suivantes:
Chaînes de requête : il se peut que vous ne souhaitiez pas utiliser de chaînes de requête car les URL peuvent être partagées par vos utilisateurs, et parfois les paramètres de requête n'ont pas de sens pour un autre utilisateur. Par exemple, une erreur telle que
?error=sessionExpired
ne devrait jamais être affichée par accident à un autre utilisateur.req.session : vous ne voudrez peut-être pas l'utiliser
req.session
car vous avez besoin de la dépendance de session express pour cela, ce qui inclut la configuration d'un magasin de sessions (tel que MongoDB), dont vous n'avez peut-être pas du tout besoin, ou peut-être utilisez-vous déjà une personnalisation solution de magasin de session.next () : Vous ne voudrez peut-être pas utiliser
next()
ounext("router")
parce que cela rend simplement votre nouvelle page sous l'URL d'origine, ce n'est pas vraiment une redirection vers la nouvelle URL, plus comme un transfert / réécriture, ce qui peut ne pas être acceptable.C'est donc ma quatrième solution qui ne souffre d'aucun des problèmes précédents. Fondamentalement, cela implique l'utilisation d'un cookie temporaire, pour lequel vous devrez d'abord installer un analyseur de cookies . Évidemment, cela signifie que cela ne fonctionnera que lorsque les cookies sont activés et avec une quantité limitée de données.
Exemple d'implémentation:
la source
express-session
. Une base de données fait simplement persister les sessions lors des redémarrages du serveur.utilisez app.set & app.get
Définition des données
Obtenir des données
la source
Voici ce que je suggère sans utiliser aucune autre dépendance, juste node et express, utilisez app.locals, voici un exemple:
la source
Vous pouvez transmettre de petits bits de données de paire clé / valeur via la chaîne de requête:
Et javascript sur la page d'accueil peut y accéder et ajuster son comportement en conséquence.
Notez que si cela ne vous dérange pas de
/category
rester en tant qu'URL dans la barre d'adresse du navigateur, vous pouvez simplement afficher directement au lieu de rediriger. À mon humble avis, les gens utilisent souvent des redirections parce que les cadres Web plus anciens rendaient la réponse directe difficile, mais c'est facile en express:Comme l'a commenté @ Dropped.on.Caprica, l'utilisation d'AJAX élimine le problème de changement d'URL.
la source
nous pouvons utiliser express-session pour envoyer les données requises
lorsque vous initialisez l'application
donc avant la redirection, enregistrez simplement le contexte de la session
Vous pouvez maintenant obtenir le contexte n'importe où pour la session. il peut être obtenu simplement par req.session.context
la source