1

我是新用于Web的Firebase身份验证。我设法获得了注册表单的工作方式,但我遇到了发送电子邮件以验证用户电子邮件地址的问题。用户创建为正常的,出现在我的控制台,但没有确认电子邮件的发送和 我碰到下面的错误在Chrome:Firebase身份验证网站:如何验证电子邮件地址

Uncaught TypeError: Cannot read property 'sendEmailVerification' of null

这里是我的代码至今:

"use strict"; 

(function() { 

    // initialize firebase 
    var config = { 
     apiKey: "//api key", 
     authDomain: "// etc", 
     databaseURL: "// etc", 
     projectId: "// etc", 
     storageBucket: "// etc", 
     messagingSenderId: "// etc" 
    }; 
    firebase.initializeApp(config); 

    // get the login form elements from HTML 
    var txtEmail = document.getElementById('txtEmail'); 
    var txtPassword = document.getElementById('txtPassword'); 
    var btnLogin = document.getElementById('btnLogin'); 
    var btnSignUp = document.getElementById('btnSignUp'); 
    var btnLogout = document.getElementById('btnLogout'); 

    // add login event 
    btnLogin.addEventListener('click', function (e) { 
     // get email and pass 
     var email = txtEmail.value; 
     var pass = txtPassword.value; 
     var auth = firebase.auth(); 
     // sign in 
     var promise = auth.signInWithEmailAndPassword(email, pass); 
     promise.catch(function (e) { 
      return console.log(e.message); 
     }); 
    }); 

    // add signup event. the signup button sends user email and pass to firebase 
    btnSignUp.addEventListener('click', function (e) { 
     // get email and pass 
     // TODO: validate email - check it is real 
     var email = txtEmail.value; 
     var pass = txtPassword.value; 
     var auth = firebase.auth(); 
     var user = firebase.auth().currentUser; 

     // sign in 
     var promise = auth.createUserWithEmailAndPassword(email, pass); 
     promise.catch(function (e) { 
      return console.log(e.message); 
     }).then(function(){user.sendEmailVerification().then(function() { 
      // Email sent. 
     }, function(error) { 
      // An error happened. 
     }) 
          }); // end verification 
    }); // end sign up button event listener 

    // show logout button when user is logged in 
    // TODO: make sure the login form clears the credentials on logout 
    btnLogout.addEventListener('click', function (e) { 
     firebase.auth().signOut(); 
    }); 

    // realtime authentication listener 
    firebase.auth().onAuthStateChanged(function (firebaseUser) { 
     if (firebaseUser) { 
      console.log(firebaseUser); 
      btnLogout.classList.remove('hide'); 
      btnSignUp.classList.add('hide'); 
      btnLogin.classList.add('hide'); 
     } else { 
      console.log('not logged in'); 
      btnLogout.classList.add('hide'); 
      btnSignUp.classList.remove('hide'); 
      btnLogin.classList.remove('hide'); 
     } // end if statement 
    }); // end function 
})(); 

我还没有找到一个简单的例子来说明如何做到这一点,文档只是提供了代码,但没有提供信息。我感谢您的帮助。谢谢。

已解决: 谢谢你的帮助。现在正在工作。以下是完整的工作代码:

"use strict"; 

(function() { 

// initialize firebase 
var config = { 
apiKey: "", 
authDomain: "", 
databaseURL: "", 
projectId: "", 
storageBucket: "", 
messagingSenderId: "" 
}; 
firebase.initializeApp(config); 

// get the login form elements from HTML 
var txtEmail = document.getElementById('txtEmail'); 
var txtPassword = document.getElementById('txtPassword'); 
var btnLogin = document.getElementById('btnLogin'); 
var btnSignUp = document.getElementById('btnSignUp'); 
var btnLogout = document.getElementById('btnLogout'); 

// login event 
btnLogin.addEventListener('click', function (e) { 
// get email and pass 
var email = txtEmail.value; 
var pass = txtPassword.value; 
var auth = firebase.auth(); 
// sign in 
var promise = auth.signInWithEmailAndPassword(email, pass); 
promise.catch(function (e) { 
return console.log(e.message); 
}); 
}); 

// add signup event. the signup button sends user email and pass to firebase 
btnSignUp.addEventListener('click', function (e) { 
// get email and pass 
// TODO: validate email - check it is real 
var email = txtEmail.value; 
var pass = txtPassword.value; 
var auth = firebase.auth(); 
var user = firebase.auth().currentUser; 

// create user and sign in 
var promise = auth.createUserWithEmailAndPassword(email, pass); 
promise.then(function(user) { 
user.sendEmailVerification().then(function() { 
// Email sent. 
}, function(error) { 
// An error happened. 
}); 
}); 
}); // end sign up button event listener 

// show logout button when user is logged in 
btnLogout.addEventListener('click', function (e) { 
firebase.auth().signOut(); 
}); 

// realtime authentication listener 
firebase.auth().onAuthStateChanged(function (firebaseUser) { 
if (firebaseUser) { 
console.log(firebaseUser); 
btnLogout.classList.remove('hide'); 
btnSignUp.classList.add('hide'); 
btnLogin.classList.add('hide'); 
} else { 
console.log('not logged in'); 
btnLogout.classList.add('hide'); 
btnSignUp.classList.remove('hide'); 
btnLogin.classList.remove('hide'); 
} // end else statement 
}); // end function 
})(); 

回答

0

@Nagaraj狮集团的解决方案是正确的,你也可以修改代码如下:

// sign in 
    var promise = auth.createUserWithEmailAndPassword(email, pass); 
    promise.then(function(user) {// You are forgetting this reference. 
     user.sendEmailVerification(); 
     // You can also call this. 
     firebase.auth().currentUser.sendEmailVerification(); 
     // Email sent. 
    }, function(error) { 
     // An error happened. 
    })` 
+0

谢谢,该代码有效。这是我更新的代码正在工作: //创建用户并登录 var promise = auth.createUserWithEmailAndPassword(email,pass); promise.then(功能(用户){ user.sendEmailVerification(),然后(函数(){// 电子邮件发送 },函数(误差){// 错误发生 });。 } ); // end promise }); //结束注册按钮事件监听器 – greynolds

0

firebase.auth()。currentUser将为null/undefined,直到您通过身份验证。请尝试发送电子邮件,如下所述。

firebase.auth().onAuthStateChanged(function (firebaseUser) { 
     if (firebaseUser) { 
      firebaseUser.sendEmailVerification().then(function() { 
      // Email sent. 
      }, function(error) { 
      // An error happened. 
      }) 
      .... 

     } else { 
      .... 
     } 
    }); 
+0

谢谢您的帮助。我现在已经开始工作了。以下是我更改的内容: //创建用户并登录 var promise = auth.createUserWithEmailAndPassword(email,pass); promise.then(功能(用户){ user.sendEmailVerification(),然后(函数(){// 电子邮件发送 },函数(误差){// 错误发生 });。 } ); // end promise }); //结束注册按钮事件监听器 – greynolds

相关问题