2014-10-14 15 views
7

Khi mã này chạm vào đường chuyển hướng, nó sẽ ném 'Không thể đặt tiêu đề sau khi chúng được gửi lỗi' và không chuyển hướng. Tôi phạm tội không hiểu đầy đủ các tiêu đề và cách diễn đạt hoạt động với chúng. This link about this error gây nhầm lẫn cho tôi một chút, có lẽ vì tôi không có đủ hiểu biết cơ bản về những gì đang xảy ra. Ngoài ra, tôi biết đây là một cách tiếp cận ngây thơ để xác thực, nhưng tôi chỉ cố gắng để có được những điều cơ bản để làm việc.Lỗi chuyển hướng nhanh: không thể đặt tiêu đề sau khi được gửi

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

CẬP NHẬT: cảm ơn @Brendan Ashworth Tôi đã bỏ lỡ một điều hiển nhiên khác, điều mà tôi đã thêm bây giờ và không còn gặp lỗi nữa.

Tuy nhiên dòng này không làm thay đổi nội dung của trang web của tôi

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

Nó đã làm việc trước khi tôi được bao bọc nó bằng séc auth

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

}

CUỐI CÙNG CẬP NHẬT !! Điều cuối cùng tôi cần là xử lý phía máy khách chuyển hướng sau khi gửi tệp. Xác thực đơn giản hoạt động hoàn hảo ngay bây giờ!

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

Bạn có thể hiển thị phần còn lại của tuyến đường và phần mềm trung gian không? Ngoài ra, cần lưu ý rằng nếu res.body.password không bằng auth.password, bạn sẽ không bao giờ gửi phản hồi, trong mã bạn đã đăng. – Paul

+0

Bạn có một tuyến đường hoặc phần mềm trung gian khác trước khi gọi phương thức này là 'res.writeHead()', 'res.send()', 'res.write()', hay cái gì đó tương tự? – mscdex

+0

@Paul Cảm ơn, đã thay đổi console.log thành res.json, cũng bao gồm nhiều mã được mã hóa – azium

Trả lời

7

Giải thích về lỗi Can't set headers after they are sent error:

Tất cả các phản ứng HTTP theo cấu trúc cơ bản này:

.. Response Line .. 
.. Headers .. 

.. Body .. 

Nếu bạn muốn chuyển hướng người sử dụng, đầu tiên Response Line sẽ được gửi với một chuyển hướng mã (cho phép nói 300), sau đó Headers sẽ được gửi với tiêu đề Location: xxx.

Sau đó, cuối cùng chúng tôi có thể gửi một nội dung (không phải trong trường hợp chuyển hướng, nhưng nói chung). Tuy nhiên - trong trường hợp có mã của bạn - bạn đang gửi phản hồi Bodyrồi cố gắng chuyển hướng người dùng. Vì các tiêu đề (và dòng phản hồi) đều đã được gửi đi (vì bạn đã gửi nội dung), nó không thể gửi nhiều tiêu đề hơn sau phần thân.

Một ví dụ về điều này trong mã của bạn sẽ là:

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

Nếu tôi giả sử đúng, bạn thực sự muốn return sau res.sendfile() gọi. Nếu auth.date là sự thật, thì bạn sẽ gửi một tệp (tức là phản hồi nội dung) và sau đó đưa ra mã chuyển hướng - điều đó không hoạt động.

+0

Tôi tin Nó đi tiêu đề -> Nội dung http://tools.ietf.org/html/rfc2616 –

+1

@self không phải là những gì tôi đặt ? –

Các vấn đề liên quan