2017-10-06 18 views
0

我想用nodeJS和firebase構建一個註冊頁面。獲取錯誤:錯誤:發送後無法設置標題。在重新渲染頁面

當用戶收到註冊錯誤時,頁面將重新加載,並向用戶顯示錯誤。 然後,如果用戶嘗試註冊,他得到了想要的頁面,但我得到:

Error: Can't set headers after they are sent.

幾個小時的研發之後,我覺得我已經明白這個問題。 我的代碼可能已經處於正文或已完成狀態,但某些功能試圖設置標題或狀態碼

有了這些知識,我試圖解決這個錯誤,但我沒有完成。

這裏是我的user.js的(控制器)代碼:

var express = require('express'); 
 
var firebase = require('firebase'); 
 
var router = express.Router(); 
 
var User = require('../models/user'); 
 
var errors; 
 
var errorMessage; 
 

 
/** 
 
sign up 
 
*/ 
 
//sign up page route 
 
router.get('/', function (req, res, next) { 
 
    console.log(errors); 
 
    if (errors) { 
 
    //Handle the errors and show them to the user 
 
    res.render('signUp', {error: true, errorMessage: errorMessage}); 
 
}else { 
 
    res.render('signUp', {title: 'Sign up', user: false, login: true}); 
 
} 
 
}); 
 

 
// sign up request 
 
router.post('/', function(req, res, next){ 
 

 
    console.log(req.body.user.email + ' made a registration request'); 
 
    console.log('Passwword: ' + req.body.user.password); 
 

 
    var email = req.body.user.email; 
 
    var password = req.body.user.password; 
 
    
 
    //reference to the firebase database 
 
    firebase.auth().createUserWithEmailAndPassword(email, password).catch(function(error) { 
 
    if (error) { 
 
     console.log(error.code); 
 
     console.log(error.message); 
 
     errorMessage = error.message; 
 
     errors = true; 
 
     res.redirect('/'); 
 
    } 
 
    }); 
 
    //if user is logged in redirect to homepage 
 
    firebase.auth().onAuthStateChanged(function(user) { 
 
    if (user) { 
 
     res.redirect('/users/home'); 
 
     console.log('User: ' + user.email + ' has logged in'); 
 
    } 
 
    }); 
 
}); 
 

 

 
module.exports = router;

我希望有人能幫助我。

+0

我認爲你正試圖兩次重定向。首先到'/'然後到'/ users/home',因爲一旦第一次重定向發生,你不會停止代碼繼續。 –

+0

@GetOffMyLawn謝謝你的回答!你知道我怎樣才能阻止代碼繼續?像休息一樣? –

回答

0

如果您正在使用節點7+版本,你可以使用async/await就像我在下面的代碼片段所做的:

var express = require('express'); 
 
var firebase = require('firebase'); 
 
var router = express.Router(); 
 
var User = require('../models/user'); 
 
var errors; 
 
var errorMessage; 
 

 

 
async function createUser(email, password) { 
 
    return new Promise(resolve => { 
 
    firebase.auth().createUserWithEmailAndPassword(email, password).catch(function(error) { 
 
     if (error) { 
 
     console.log(error.code); 
 
     console.log(error.message); 
 
     errorMessage = error.message; 
 
     errors = true; 
 
     return resolve(true) 
 
     } 
 
     resolve(false) 
 
    }); 
 
    }) 
 
} 
 

 
async function authChange() { 
 
    return new Promise(resolve => { 
 
    firebase.auth().onAuthStateChanged(function(user) { 
 
     if (user) { 
 
     console.log('User: ' + user.email + ' has logged in'); 
 
     return resolve(true) 
 
     } 
 
     resolve(false) 
 
    }); 
 
    }) 
 
} 
 

 

 
// sign up request 
 
router.post('/', async function(req, res, next) { 
 

 
    console.log(req.body.user.email + ' made a registration request'); 
 
    console.log('Passwword: ' + req.body.user.password); 
 

 
    var email = req.body.user.email; 
 
    var password = req.body.user.password; 
 

 
    //reference to the firebase database 
 
    let error = await createUser(email, password) 
 
    if (error) { 
 
    res.redirect('/'); 
 
    } else { 
 
    let logged = await authChange() 
 
    if (logged) { 
 
     res.redirect('/users/home'); 
 
    } 
 
    } 
 
}); 
 

 
module.exports = router;

+0

感謝您的建議。我沒有收到任何錯誤,但登錄後不會重定向到主頁。有什麼建議麼? –

相關問題