Express redirection erreur: ne peut pas définir les en-têtes une fois qu'ils sont envoyés
Lorsque ce code frappe la redirection ligne il jette le 'ne Peut pas définir les en-têtes une fois qu'ils sont envoyés erreur" et n'a pas de redirection. Je suis coupable de ne pas comprendre pleinement les en-têtes et comment express travaille avec eux. Ce lien à propos de cette erreur est source de confusion, un peu de moi, sans doute parce que je n'ai pas une base suffisamment de compréhension de ce qui se passe. Aussi, je sais c'est un peu d'une approche naïve pour l'authentification, mais je suis juste essayer d'obtenir des choses de base pour le travail.
app.post('/api/login', function(req, res) {
if (req.body.password === auth.password) {
auth.date = new Date()
res.redirect('/admin')
} else {
console.log("wrong pw")
}
})
Mise à JOUR : merci à @Brendan Ashworth j'ai raté une évidente d'autre, que j'ai ajouté maintenant et n'a plus l'erreur.
Cependant, cette ligne ne modifie pas le contenu de ma page
res.sendfile('./public/admin/views/tunes.html')
Il a travaillé avant j'ai enveloppé avec l'auth vérifier
var auth = require('../config/auth')
module.exports = function(app) {
/*
* CONTENT API
*/
//...
/*
* Admin Routes
*/
app.get('/admin/login', function(req, res) {
res.sendfile('./public/admin/views/login.html')
})
app.post('/api/login', function(req, res) {
if (req.body.password === auth.password) {
auth.date = new Date()
res.redirect('/admin')
} else {
res.json({message: 'Wrong password!'})
}
})
app.get('/admin', function(req, res) {
if (auth.date) {
res.sendfile('./public/admin/views/tunes.html')
console.log("test") //
} else { //added else
res.redirect('/admin/login')
}
})
app.get('/admin/:url', function(req, res) {
if (auth.date) {
res.sendfile('./public/admin/views/' + req.params.url + '.html')
} else { //added else
res.redirect('/admin/login')
}
})
//frontend routes
//route to handle all angular requests
app.get('*', function(req, res) {
res.sendfile('./public/views/index.html')
})
}
DERNIÈRE MISE À JOUR!! La dernière chose dont j'avais besoin était de gérer la redirection côté client après l'envoi du fichier. L'authentification Simple fonctionne parfaitement maintenant!
$http.post('/api/login', $scope.auth).success(function() {
window.location.href = '/admin'
})
Avez-vous une autre route ou middleware avant ce qui demande
res.writeHead()
, res.send()
, res.write()
, ou quelque chose de similaire?Merci, changé de console.journal de res.json, également inclus plus codées
OriginalL'auteur azium | 2014-10-14
Vous devez vous connecter pour publier un commentaire.
Une explication de l'erreur
Can't set headers after they are sent error
:Toutes les réponses HTTP suivre cette structure de base:
Si vous souhaitez rediriger un utilisateur, d'abord le
Response Line
sera envoyé avec un code de redirection (disons 300), puis leHeaders
sera envoyé avec unLocation: xxx
en-tête.Puis, on peut enfin envoyer un corps (pas dans le cas d'une redirection, mais en général). Cependant, dans le cas de votre code - vous l'envoi d'un
Body
réponse puis essayer de rediriger l'utilisateur. Depuis les en-têtes (et de la ligne de réponse) ont déjà été envoyés (parce que vous avez envoyé le corps), il ne peut pas envoyer plus de têtes après le corps.Un exemple de cela dans votre code serait:
Si je suis en supposant que la droite, vous voulez vraiment
return
après lares.sendfile()
appel. Siauth.date
est truthy, alors vous allez être l'envoi d'un fichier (c'est à dire corps de la réponse), puis en donnant une redirection de code qui ne fonctionne pas.n'est-ce pas ce que j'ai mis?
M'a sauvé beaucoup de temps, en ajoutant de retour après res.rediriger le problème est réglé pour moi.
OriginalL'auteur Brendan Ashworth