Ich habe Probleme mit dem Setzen von Cookies per Express. Ich benutze Este.js dev stack
und versuche ein Cookie in der API auth /login
route zu setzen. Hier ist der Code, den ich in /api/v1/auth/login
route
In src/server/main.js
Ich habe cookie-parser
als erste Middleware registriert
Der Antwortkopf für /api/v1/auth/login
route enthält
aber der Cookie wird nicht im Browser gespeichert ( document.cookie
ist leer, auch Resources - Cookies
tab in develepoers tools ist leer): (
BEARBEITEN:
Ich habe festgestellt, dass wenn ich dies in /api/v1/auth/login
(ohne Aufruf res.send
oder res.json
)
res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false});
next();
Dann wird der Cookie gesetzt UND der Antwort-Header hat X-Powered-By:Este.js
... gesetzt. Dies setzt esteMiddleware
in expres Frontend-Rendering-Teil .
Wenn ich res.send
Dann erhalte ich den Fehler Can't set headers after they are sent.
, weil send
method verwendet wird, damit der Frontend-Render diesen Fehler auslöst.
Aber ich muss Daten von API senden, also wie kann ich damit umgehen?
Können mir manche bitte helfen? Danke!
Ich hatte das gleiche Problem. Die Serverantwort enthält einen Cookie-Satz:
%Vor%Aber der Cookie wurde nicht von einem Browser gespeichert.
So habe ich es gelöst.
Ich verwende fetch
in einem clientseitigen Code. Wenn Sie die Optionen credentials: 'include'
in fetch
nicht angeben, werden Cookies weder an den Server gesendet noch von einem Browser gespeichert, obwohl die Serverantwort Cookies festlegt.
Beispiel:
%Vor%Ich hoffe, es hilft jemandem.
Ich arbeite mit Express 4 und Knoten 7.4 und eckig, ich hatte das gleiche Problem mir helfen, dies:
a) Server-Seite: In der Datei app.js gebe ich alle Antworten wie:
das muss vor allen routern sein .
Ich habe viele dieser Header gesehen:
aber ich brauche das nicht,
b) Wenn Sie Cookie definieren, müssen Sie httpOnly: false wie:
c) clientseitig: In send ajax brauchen Sie add: "withCredentials: true" wie:
%Vor%viel Glück.
Es gibt ein paar Probleme:
httpOnly : false
festgelegt wurde, wird nicht über document.cookie
im Browser aufgerufen. Es wird immer noch mit HTTP-Anfragen gesendet, und wenn Sie die Dev-Tools Ihres Browsers überprüfen, werden Sie höchstwahrscheinlich den Cookie dort finden (in Chrome finden Sie sie im Ressourcen Tab der Dev-Tools); next()
, das Sie anrufen, sollte nur verwendet werden, wenn Sie das Zurücksenden einer Antwort an einen anderen Teil Ihrer Anwendung verzögern möchten, was nach Ihrem Code nicht Ihren Vorstellungen entspricht. Es scheint mir also, dass dies Ihre Probleme lösen sollte:
%Vor% Als Nebenbemerkung: Es gibt einen Grund dafür, dass httpOnly
standardmäßig auf true
gesetzt ist (um zu verhindern, dass bösartige XSS-Skripts auf Sitzungscookies und dergleichen zugreifen). Wenn Sie keinen sehr guten Grund haben, über clientseitige JS auf den Cookie zugreifen zu können, setzen Sie ihn nicht auf false
.