Ich möchte in der Lage sein, ein einzelnes Cookie zu setzen und dieses einzelne Cookie bei jeder Anforderung an die Serverinstanz von nodejs zu lesen. Kann dies in wenigen Codezeilen erfolgen, ohne dass eine Drittanbieter-Bibliothek abgerufen werden muss?
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
Versuchen Sie einfach, den obigen Code direkt von nodejs.org zu übernehmen und ein Cookie darin zu verarbeiten.
javascript
cookies
node.js
Corey Hart
quelle
quelle
=
) wie in einem der Facebook-Cookies wie enthältfbm_1234123412341234=base_domain=.domain.com
.;
dahin durch die erste Instanz von aufgeteilt=
. Links ist der Schlüssel, rechts ist der Wert.parts[0]
zuparts.shift()
undparts[1]
zuparts.join('=')
Wenn Sie die Express-Bibliothek verwenden, wie es viele Entwickler von node.js tun, gibt es einen einfacheren Weg. Weitere Informationen finden Sie auf der Dokumentationsseite von Express.js.
Das obige Parsing-Beispiel funktioniert, aber Express bietet Ihnen eine nette Funktion, um dies zu erledigen:
So setzen Sie ein Cookie:
So löschen Sie den Cookie:
quelle
cookie-parser
ist nicht mehr Teil von Express und / oder Connect, sondern als Middleware verfügbar: github.com/expressjs/cookie-parserRevNoah hatte die beste Antwort mit dem Vorschlag, den Cookie-Parser von Express zu verwenden . Aber diese Antwort ist jetzt 3 Jahre alt und veraltet.
Mit Express können Sie ein Cookie wie folgt lesen
Und aktualisieren Sie Ihre
package.json
mit den folgenden, indem Sie die entsprechenden relativ neuesten Versionen ersetzen.Weitere Vorgänge wie das Setzen und Parsen von Cookies werden hier und hier beschrieben
quelle
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Als Erweiterung der Antwort von @Corey Hart habe ich Folgendes
parseCookies()
verwendet:Hier ist das Arbeitsbeispiel:
Ich stelle auch fest, dass das OP das http-Modul verwendet. Wenn das OP restify verwendet hat , kann er restify-Cookies verwenden :
quelle
let/const
undstringifyCookies
können Sie mit einem ausgekleidet sein,map
anstatt auf diese Weise ein Array zu erstellen .Sie können das npm-Modul "Cookies" verwenden, das über umfassende Funktionen verfügt.
Dokumentation und Beispiele unter:
https://github.com/jed/cookies
quelle
So lassen Sie einen Cookie-Splitter mit Cookies arbeiten, deren Cookie-Werte '=' enthalten:
dann, um einen individuellen Cookie zu bekommen:
quelle
Cookies werden über HTTP-Header übertragen.
Sie müssen nur die Anforderungsheader analysieren und Antwortheader einfügen.
quelle
Hier ist ein ordentlicher Patch zum Kopieren und Einfügen zum Verwalten von Cookies im Knoten. Ich mache das in CoffeeScript, für die Schönheit.
Jetzt können Sie Cookies wie erwartet verarbeiten:
quelle
Lassen Sie mich diesen Teil der Frage wiederholen, den die Antworten hier ignorieren:
Cookies lesen
Cookies werden aus Anfragen mit dem
Cookie
Header gelesen . Sie enthalten nur einname
undvalue
. Aufgrund der Funktionsweise von Pfaden können mehrere gleichnamige Cookies gesendet werden. In NodeJS werden alle Cookies als eine Zeichenfolge angezeigt, wenn sie imCookie
Header gesendet werden . Sie teilen sie mit;
. Sobald Sie einen Cookie haben, ist alles links von den Gleichen (falls vorhanden) dasname
, und alles danach ist dasvalue
. Einige Browser akzeptieren ein Cookie ohne Gleichheitszeichen und nehmen an, dass der Name leer ist. Leerzeichen zählen nicht als Teil des Cookies. Werte können auch in doppelte Anführungszeichen gesetzt werden ("
). Werte können auch enthalten=
. Zum Beispielformula=5+3=8
ist ein gültiger Cookie.Wenn Sie keine doppelten Namen erwarten, können Sie in ein Objekt konvertieren, was die Arbeit erleichtert. Dann können Sie gerne
object.myCookieName
darauf zugreifen , um den Wert zu erhalten. Wenn Sie Duplikate erwarten, möchten Sie diese durchlaufencookieEntries
. Browser füttern Cookies mit absteigender Priorität. Durch das Umkehren wird sichergestellt, dass das Cookie mit der höchsten Priorität im Objekt angezeigt wird. (Dies.slice()
soll eine Mutation des Arrays vermeiden.)Einstellungen Cookies
Das "Schreiben" von Cookies erfolgt mithilfe des
Set-Cookie
Headers in Ihrer Antwort. Dasresponse.headers['Set-Cookie']
Objekt ist eigentlich ein Array, also werden Sie darauf drängen. Es akzeptiert eine Zeichenfolge, hat jedoch mehr Werte als nurname
undvalue
. Der schwierigste Teil ist das Schreiben der Zeichenfolge, dies kann jedoch in einer Zeile erfolgen.Denken Sie daran, dass Sie mehrere Cookies setzen können, da Sie
Set-Cookie
in Ihrer Anfrage tatsächlich mehrere Header setzen können. Deshalb ist es ein Array.Hinweis zu externen Bibliotheken:
Wenn Sie sich entscheiden , die verwenden
express
,cookie-parser
odercookie
stellen sie Standardwerte haben , die nicht Standard sind. Die analysierten Cookies sind immer URI-dekodiert (prozentual dekodiert). Das heißt, wenn Sie einen Namen oder Wert verwenden, der eines der folgenden Zeichen enthält:!#$%&'()*+/:<=>?@[]^`{|}
Diese werden in diesen Bibliotheken unterschiedlich behandelt. Wenn Sie Cookies setzen, werden diese mit codiert%{HEX}
. Und wenn Sie einen Cookie lesen, müssen Sie ihn entschlüsseln.Während es sich beispielsweise
[email protected]
um ein gültiges Cookie handelt, codieren diese Bibliotheken es alsemail=name%40domain.com
. Das Dekodieren kann Probleme verursachen, wenn Sie das%
in Ihrem Cookie verwenden. Es wird verstümmelt. Zum Beispiel wird Ihr Cookie, das war:secretagentlevel=50%007and50%006
wirdsecretagentlevel=507and506
. Das ist ein Randfall, aber etwas zu beachten, wenn Bibliotheken gewechselt werden.Außerdem werden in diesen Bibliotheken Cookies mit einer Standardeinstellung festgelegt,
path=/
was bedeutet, dass sie bei jeder URL-Anforderung an den Host gesendet werden.Wenn Sie diese Werte selbst zu kodieren oder entschlüsseln möchten, können Sie verwenden ,
encodeURIComponent
oderdecodeURIComponent
, respectively.Verweise:
Zusätzliche Information:
quelle
Zuerst muss ein Cookie erstellt werden (ich habe das Token als Beispiel in das Cookie eingewickelt) und dann als Antwort festgelegt werden. Um das Cookie wie folgt zu verwenden, installieren Sie cookieParser
Der Browser speichert es auf der Registerkarte "Ressource" und wird für jede Anforderung verwendet, wobei anschließend die ursprüngliche URL als Basis verwendet wird
Das Abrufen von Cookies von einer Anforderung auf der Serverseite ist ebenfalls einfach. Sie müssen das Cookie aus der Anforderung extrahieren, indem Sie die Eigenschaft 'cookie' des Anforderungsobjekts aufrufen.
quelle
Wenn es Ihnen egal ist, was in der Version enthalten ist
cookie
und Sie sie nur verwenden möchten, versuchen Sie diesen sauberen Ansatz mitrequest
(einem beliebten Knotenmodul):quelle
jar()
ein niedlicher Methodenname, um die aktuelle Liste der Cookies zu erhalten? Was ist der Sinn der 2 Aufrufe der Anfrage? Dies ist meistens eine Werbung, keine Antwort.quelle
Verwenden von ES5 / 6 Sorcery & RegEx Magic
Hier ist eine Option, um die Cookies zu lesen und sie in ein Objekt von Schlüssel zu verwandeln. Wertepaare für die Clientseite könnten es auch serverseitig verwenden.
Hinweis : Wenn
=
der Wert ein enthält, machen Sie sich keine Sorgen. Wenn es einen=
Schlüssel gibt, Ärger im Paradies.Weitere Hinweise : Einige argumentieren möglicherweise mit der Lesbarkeit, also teilen Sie sie nach Ihren Wünschen auf.
Ich mag Notizen : Das Hinzufügen eines Fehlerbehandlers (try catch) würde nicht schaden.
Was ist los?
iLikeCookies()
teilt die Cookies durch;
( Leerzeichen nach;
):Dann ordnen wir dieses Array zu und teilen es nach dem ersten Auftreten der
=
Verwendung von Regex-Erfassungsparens auf :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Verwenden Sie dann unseren Freund `Object.fromEntries, um dies zu einem Objekt aus Schlüssel- und Wertpaaren zu machen.
Nooice.
quelle
Ich habe diese einfache Funktion nur übergeben
req.headers.cookie
und Cookie-Namenquelle