创建用户,保存数据然后更改页面

时间:2017-08-08 13:20:07

标签: javascript firebase firebase-realtime-database firebase-authentication

我正在尝试创建一个"创建用户"功能在我的网页上。在创建用户时,它同时存储用户编写的数据,例如名称等。在这样做之后,应该向用户呈现仅针对用户的页面,问题在于我的代码在用户的数据之前(名称等)。 )存储,向用户呈现新页面。我该如何防止这种情况发生?

我的创建用户功能:



firebase.auth().createUserWithEmailAndPassword(email, pass).then(function() {
  // User is created
  const imageUrl = "images/genericProfilePicture.png";
  const admin = false;
  const currentTime = timeStamp();

  var user = firebase.auth().currentUser;
  const userId = user.uid;


  firebase.database().ref('users/' + userId).set({
    name: name,
    email: email,
    address: address,
    zip: zip,
    city: city,
    department: department,
    membership: membership,
    admin: admin,
    added: currentTime,
    profile_picture : imageUrl
  });

  window.open('frontpage.php', '_top');


}).catch(function(error) {
  // Error has happened
  var errorCode = error.code;
  var errorMessage = error.message;

  alert(errorMessage);
});




尝试使用此代码没有任何运气,没有存储数据且没有新页面显示:



firebase.database().ref('users/' + userId).set({
								name: name,
								email: email,
								address: address,
								zip: zip,
								city: city,
								department: department,
								membership: membership,
								admin: admin,
								added: currentTime,
								profile_picture : imageUrl
							}).then(() => {
    						window.open('frontpage.php', '_top');
  						});




3 个答案:

答案 0 :(得分:1)

更新内容是异步的,并且您没有收听由例如返回的承诺。您正在使用的.set()。因此,您只需在开始更新操作后立即执行window.open(),因此如果更新需要花费大量的毫秒时间,那么您最终将加载下一页在更新完成之前。

因此,正如文档(https://firebase.google.com/docs/database/web/read-and-write)中所建议的那样,使用.set()返回的promise来确定何时在后端完成更新,然后将用户引导到下一页。在实践中,我猜测它应该就像将window.open放在.then的{​​{1}}块中一样简单。

虽然看起来你需要在做这类事之前先学习承诺的基础知识(例如https://developers.google.com/web/fundamentals/getting-started/primers/promises),但我会给你一个你应该使用的模板:

.set

答案 1 :(得分:1)

选项1

只需将set()then()块链接起来:

firebase.database().ref('users/' + userId).set({
    name: name,
    email: email,
    address: address,
    zip: zip,
    city: city,
    department: department,
    membership: membership,
    admin: admin,
    added: currentTime,
    profile_picture : imageUrl
  }).then(function(){
        window.open('frontpage.php', '_top');
    }) ...

选项2 :(如果您确实需要验证某些用户详细信息)

您可以检查用户是否已添加到数据库,然后显示该窗口。

类似的东西:

function getUserStatus(uid) {
    return firebase.database().ref('/users/' + uid).once('value').then(function(snapshot) {
        if (snapshot.val() != null) {
            return snapshot.val().name;
        }
        return '';
    });
}

您可以在代码中链接此方法:

firebase.database().ref('users/' + userId).set({
    name: name,
    email: email,
    address: address,
    zip: zip,
    city: city,
    department: department,
    membership: membership,
    admin: admin,
    added: currentTime,
    profile_picture : imageUrl
  });

getUserStatus(user.uid).then(function(name) {
    if (name !== '') {
       window.open('frontpage.php', '_top');
    }
});

答案 2 :(得分:0)

set也会返回一个承诺,因此您也需要.then

firebase.database().ref('users/' + userId)
  .set()
  .then(() => {
    window.open('frontpage.php', '_top');
  });