2014-10-14 5 views
7

이 코드가 리디렉션 라인에 도달하면 '보낸 후에 헤더를 설정할 수 없습니다'오류가 발생하고 리디렉션되지 않습니다. 나는 머리글을 완벽하게 이해하지 못하고 표현이 어떻게 작동하는지 유죄입니다. This link about this error은 나에게 조금 혼란 스럽다. 아마도 내가 무슨 일이 벌어지고 있는지 충분히 이해하지 못했기 때문일 것이다. 또한, 이것은 인증에 대한 순진한 접근 방법이라는 것을 알고 있지만 기본적인 작업을 수행하려고 노력하고 있습니다.Express redirect error : 보낸 후 헤더를 설정할 수 없습니다.

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") 
     } 
    }) 

UPDATE : @Brendan 애쉬 워스에게 감사 나는 지금 추가 및 더 이상 오류가없는 한, 이는 다른 명백한을 놓쳤다.

그러나이 줄을 내가 인증 검사

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') 
}) 

}

최종 업데이트로 포장하기 전에이 일

res.sendfile('./public/admin/views/tunes.html') 

내 페이지의 내용을 변경하지 않습니다! 마지막으로 필요한 것은 파일을 보낸 후 리디렉션 클라이언트 측을 처리하는 것이 었습니다. 간단한 인증은 이제 완벽하게 작동합니다!

$http.post('/api/login', $scope.auth).success(function() { 
     window.location.href = '/admin' 
    }) 
+0

나머지 경로와 미들웨어를 표시 할 수 있습니까? 또한 res.body.password가 auth.password와 같지 않은 경우 게시 한 코드에서 응답을 보내지 않을 것임을 유의해야합니다. – Paul

+0

'res.writeHead()','res.send()','res.write()'또는 비슷한 것을 호출하는 다른 경로 나 미들웨어가 있습니까? – mscdex

+0

@Paul 감사합니다. console.log를 res.json으로 변경했습니다. 코드가 더 많이 포함되어 있습니다. – azium

답변

7

오류 Can't set headers after they are sent error에 대한 설명 :

모든 HTTP 응답

이 기본 구조를 따르

먼저 Response Line이 리디렉션으로 전송됩니다
.. Response Line .. 
.. Headers .. 

.. Body .. 

사용자를 리디렉션 할 경우, 코드 (300이라고 말하면) Location: xxx 헤더와 함께 Headers이 전송됩니다.

그런 다음 본문을 보낼 수 있습니다 (리디렉션의 경우는 아니지만 일반적으로). 그러나 코드가있는 경우 Body 응답 을 보내고 사용자를 리디렉션하려고합니다. 헤더 (및 응답 행)는 이미 전송되었으므로 (본문을 전송했기 때문에) 본문 뒤에 더 많은 헤더를 보낼 수 없습니다.

코드에서 이것의 예는 다음과 같습니다

app.get('/admin', function(req, res) { 
    if (auth.date) { 
     res.sendfile('./public/admin/views/tunes.html') 
    } 
    res.redirect('/admin/login') 
}) 

내가 바로 믿고있어 경우, 당신은 실제로 res.sendfile() 호출 후 return로합니다. auth.date이 사실이라면 파일 (즉, 본문 답변)을 보내고 작동하지 않는 리디렉션 코드를 제공하게됩니다.

+0

헤더가 이동합니다. http://tools.ietf.org/html/rfc2616 –

+1

@self ? –

관련 문제