2017-07-19 4 views
0

Ich halte Begegnung mit diesen Fehler, wenn ich meinen Code ausführen, die die Pseudo-Code unten aufgeführt hat (Um zu klären, ist mein Code basiert auf der Reaktion-redux-universal-hot-Beispiel)Express.js Sitzung - Umleitung Fehler

Error: Can't set headers after they are sent. 
[2]  at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
[2]  at ServerResponse.header (/pathToUI/ui/node_modules/express/lib/response.js:718:10) 
[2]  at ServerResponse.location (/pathToUI/ui/node_modules/express/lib/response.js:835:8) 
[2]  at ServerResponse.redirect (/pathToUI/ui/node_modules/express/lib/response.js:874:8) 
[2]  at api.js:165:11 
[2]  at Layer.handle  [as handle_request] (/pathToUI/ui/node_modules/express/lib/router/layer.js:95:5) 
[2]  at trim_prefix (/pathToUI/ui/node_modules/express/lib/router/index.js:312:13) 
[2]  at /pathToUI/ui/node_modules/express/lib/router/index.js:280:7 
[2]  at Function.process_params (/pathToUI/ui/node_modules/express/lib/router/index.js:330:12) 
[2]  at next (/pathToUI/ui/node_modules/express/lib/router/index.js:271:10 

Ich versuche, den Benutzer auf die Homepage (/) umzuleiten und der Benutzer ist nach der Anmeldung bei/home. Grundsätzlich wird die Sitzung von einem Timer in der Express-Sitzung gesteuert. Wenn die Zeit abgelaufen ist, möchte ich den Benutzer auf die Homepage umleiten (das nächste Mal, wenn eine Anfrage gestellt wird).

der folgende Code in den api.js file

app.use((req, res, next) => { 

    if (req.session.user != undefined) { 
     if(sessionNotOver) 
      Renew session 
    } 
    else if (sessionOver/ expired) { 
     console.log('expired session'); 
     res.status(403).end('SESSION EXPIRED'); 
     res.redirect('/'); 
     return; 
     //req.session.destroy(); 
    } else { 
     console.log('session has no user, but it is: ' + JSON.stringify(req.session)); 
    } 
}); 

ich in der Lage bin richtig Spur der Sitzung zu halten, aber ich habe Probleme beim Umleiten des Benutzers auf die Homepage wäre. Welche Tipps haben Sie, um dies zu erreichen? Wäre es besser für mich, die Weiterleitung woanders (dh in server.js?)

Ich habe versucht, mehrere Stackoverflow Beiträge zu konsultieren und ich habe auch eine Menge Googeln/Testen, aber nichts scheint zu funktionieren. Ich könnte jedoch etwas falsch verstehen, also wäre es schön, wenn jemand einige Dinge klären und/oder mir ein paar Tipps geben könnte. Vielen Dank!

EDIT Also habe ich versucht, die Linie zu ändern, wie Shimon Brandsdorfer unten erwähnt, aber meine Anwendung nicht umleiten noch nicht, jetzt ist es nur auf einem Ladebildschirm stecken, die eine andere Komponente, die eine Lade gif, bis der andere Timer zeigt (in App.js) läuft ab.

+0

Dieser Fehler ist, weil Sie versuchen, eine andere Antwort nach 'res.status (403) zu senden .end ('SESSION EXPIRED');'. Nachdem Sie 'end()' aufgerufen haben, können Sie keine weitere Antwort mehr senden. Überprüfen Sie hier https://Stackoverflow.com/a/7086621/7096322 –

+0

"Ich kann den Code aus Gründen der Privatsphäre nicht posten" Ihre Codes nicht speziell – Darkrum

+0

@Darkrum Ich habe den Beitrag mit weiteren Details über die grundlegende Struktur des Codes aktualisiert . Wenn du mir helfen kannst, wäre das großartig. –

Antwort

0

Nun, Ihr Fehler ist selbsterklärend, Sie können nicht zweimal eine HTTP-Antwort auf die gleiche Anfrage senden. Sobald Sie res.status(403).end() getan haben, haben Sie tatsächlich die Antwort gesendet, und Sie können anschließend nicht umleiten.

Also was Sie tun können, ist einfach die Antwort nur einmal senden.

res.redirect(403, '/'); 

Oder:

res.status(403).location('/').end('sesssion expired'); 
+0

Vielen Dank für Ihre Hilfe. Ich muss diese Zeile übersehen haben, als ich die API gelesen habe. Ich habe meinen Beitrag oben mit weiteren Details zur Einrichtung meiner Webanwendung aktualisiert (die grundlegende Struktur ist das Beispiel, das ich erwähnt habe). –