2017-10-06 11 views
0

nodeJSとfirebaseで登録ページを作成しようとしています。エラーの取得:エラー:送信後にヘッダーを設定できません。ページを再レンダリングした後

ユーザーが登録エラーを取得すると、ページがリロードされ、エラーがユーザーに表示されます。ユーザーが登録しようとすると はその後、彼は目的のページになりますが、私は得る:研究の数時間後

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

を、私は問題を理解していると思います。 私のコードはすでにBodyまたはFinished状態になっていますが、一部の関数がヘッダーまたはstatusCodeを設定しようとしました

この知識を使って、このエラーを解決しようとしましたが、ここで

は私の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;

私は、誰かが私を助けることができると思います。あなたはノードのバージョン7+を使用している場合は、私は次のスニペットでやったように

+0

私はあなたが二回リダイレクトしようとしていると思います。最初のリダイレクトが発生してもコードが続行されないようにするため、最初に '/'から '/ users/home'に移動します。 –

+0

@GetOffMyLawnお返事ありがとうございます!コードの継続を止める方法を知っていますか?休憩のようなもの? –

答えて

0

、あなたは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

ご意見ありがとうございます。私はエラーは発生していませんが、ログイン後にホームサイトにリダイレクトしません。助言がありますか? –

関連する問題