Ich verwende Express, um eine Web-App in node.js zu erstellen. Dies ist eine Vereinfachung dessen, was ich habe:
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('/');
});
Mein Problem ist folgendes:
Wenn ich feststelle, dass die gesendeten Daten /category
nicht validiert werden, möchte ich der /
Seite einen zusätzlichen Kontext übergeben . Wie könnte ich das machen? Die Umleitung scheint keine zusätzlichen Parameter zuzulassen.
flash
: stackoverflow.com/questions/12442716/…/
Seite. Es gibt eine/
Route, die Express bedienen kann, und es gibt eine Homepage-Vorlage, die Express rendern kann. Wenn Sie einige Daten zum Rendern der Homepage-Vorlage nach einer Umleitung beibehalten möchten, sind Sitzungen trotz der akzeptierten Antwort Ihr Freund. Sie bieten Ihnen einen Datenspeicher, der über Anfragen und Antworten für einzelne Browserbenutzer hinweg bestehen bleibt, sodass Sie Daten während der/category
Verarbeitung eingeben und dann herausnehmen können, wenn sie während der/
Übergabe vorhanden sind.Antworten:
Es gibt verschiedene Möglichkeiten, Daten an verschiedene Routen weiterzuleiten. Die richtigste Antwort sind natürlich Abfragezeichenfolgen. Sie müssen sicherstellen, dass die Werte ordnungsgemäß cododeURIComponent und decodeURIComponent sind .
Sie können dies auf Ihrer anderen Route feststellen, indem Sie die Parameter mithilfe von senden
req.query
.Für eine dynamischere Methode können Sie das
url
Kernmodul verwenden, um die Abfragezeichenfolge für Sie zu generieren:Wenn Sie also alle erforderlichen Abfragezeichenfolgenvariablen umleiten möchten, können Sie dies einfach tun
Und wenn Sie Node> = 7.x verwenden, können Sie auch das
querystring
Kernmodul verwendenEine andere Möglichkeit besteht darin, in der Sitzung etwas einzurichten. Sie können hier lesen, wie Sie es einrichten , aber das Festlegen und Zugreifen auf Variablen ist ungefähr so:
Und später nach der Weiterleitung ...
Es besteht auch die Möglichkeit, eine alte Express-Funktion zu verwenden
req.flash
. Um dies in neueren Versionen von Express zu tun, müssen Sie eine andere Bibliothek verwenden. Im Wesentlichen können Sie damit Variablen einrichten, die beim nächsten Besuch einer Seite angezeigt und zurückgesetzt werden. Es ist praktisch, um Benutzern Fehler anzuzeigen, aber es wurde standardmäßig wieder entfernt. BEARBEITEN: Es wurde eine Bibliothek gefunden, die diese Funktionalität hinzufügt.Hoffentlich erhalten Sie dadurch eine allgemeine Vorstellung davon, wie Sie Informationen in einer Express-Anwendung weitergeben können.
quelle
/
erreichen. Eine andere Möglichkeit besteht darin, die Postroute über AJAX aufzurufen und die resultierenden Daten in localstorage oder ähnlichem zu speichern.Der einfachste Weg, Daten zwischen routeHandlern zu übertragen, um sich
next()
nicht mit Weiterleitungen oder Sitzungen herumschlagen zu müssen. Optional können Sie einfach IhrehomeCtrl(req,res)
anstelle von anrufennext()
und einfach dasreq
und übergebenres
quelle
/
Ich musste eine andere Lösung finden, da keine der bereitgestellten Lösungen aus folgenden Gründen tatsächlich meinen Anforderungen entsprach:
Abfragezeichenfolgen : Möglicherweise möchten Sie keine Abfragezeichenfolgen verwenden, da die URLs von Ihren Benutzern gemeinsam genutzt werden können und die Abfrageparameter für einen anderen Benutzer manchmal nicht sinnvoll sind. Zum Beispiel sollte ein Fehler, wie er
?error=sessionExpired
niemals versehentlich einem anderen Benutzer angezeigt werden sollte.req.session : Möglicherweise möchten Sie nicht verwenden,
req.session
da Sie hierfür die Express-Sitzungsabhängigkeit benötigen. Dazu gehört das Einrichten eines Sitzungsspeichers (z. B. MongoDB), den Sie möglicherweise überhaupt nicht benötigen oder den Sie möglicherweise bereits verwenden Session Store-Lösung.next () : Möglicherweise möchten Sie nicht verwenden
next()
odernext("router")
da dies im Wesentlichen nur Ihre neue Seite unter der ursprünglichen URL rendert, handelt es sich nicht wirklich um eine Umleitung zur neuen URL, sondern eher um ein Weiterleiten / Umschreiben, was möglicherweise nicht akzeptabel ist.Dies ist also meine vierte Lösung, die unter keinem der vorherigen Probleme leidet. Grundsätzlich wird ein temporäres Cookie verwendet, für das Sie zuerst den Cookie-Parser installieren müssen . Dies bedeutet natürlich, dass es nur funktioniert, wenn Cookies aktiviert sind und nur eine begrenzte Datenmenge vorhanden ist.
Implementierungsbeispiel:
quelle
express-session
. Eine Datenbank sorgt nur dafür, dass Sitzungen bei Serverneustarts bestehen bleiben.Verwenden Sie app.set & app.get
Daten einstellen
Daten abrufen
quelle
Hier ist, was ich vorschlage, ohne eine andere Abhängigkeit zu verwenden, nur Knoten und Ausdruck, verwenden Sie app.locals, hier ist ein Beispiel:
quelle
Sie können kleine Bits von Schlüssel / Wert-Paar-Daten über die Abfragezeichenfolge übergeben:
Und Javascript auf der Homepage kann darauf zugreifen und sein Verhalten entsprechend anpassen.
Beachten Sie, dass Sie, wenn es Ihnen nichts ausmacht
/category
, als URL in der Adressleiste des Browsers zu bleiben, einfach direkt rendern können, anstatt umzuleiten. IMHO verwenden viele Leute Weiterleitungen, weil ältere Web-Frameworks das direkte Reagieren erschwerten, aber es ist im Express einfach:Wie @ Dropped.on.Caprica kommentierte, beseitigt die Verwendung von AJAX das Problem der URL-Änderung.
quelle
Wir können Express-Session verwenden , um die erforderlichen Daten zu senden
wenn Sie die App initialisieren
Speichern Sie vor der Umleitung einfach den Kontext für die Sitzung
Jetzt können Sie den Kontext für die Sitzung überall abrufen. es kann nur durch req.session.context bekommen
quelle