AngularFire2 - 在更新之前检查对象是否存在

时间:2016-12-27 03:12:27

标签: angular firebase firebase-realtime-database angularfire2

我们说我正在收集用户名,我想检查一下我的Firebase数据库中是否已存在此用户名。 AngularFire2 updateset方法实际上并未检查对象是否存在,但如果存在,则替换它。有没有办法检查并说出返回一个可观察到的错误?

目前我的解决方案是检索对象,如果有结果,我知道它存在。我正在寻找一种更简单的方法来检查它。

我需要将其作为数据库对象,而不是身份验证中的实际用户。

let userExists = false;

this.af.database.object('/users/' + newUser.name).subscribe( user => {
    if (user) {
      userExists = true;
      console.log('This username is taken. Try another one');
    }
    else {
      this._af.database.object('/users/' + newUser.name).update({
         email: 'johndoe@example.com',
         password: '!@#$1234'
     })
   }
});

3 个答案:

答案 0 :(得分:7)

Firebase交易

Firebase为这种情况提供了transaction方法。

  

transaction()用于将现有值修改为新值,确保与同时写入同一位置的其他客户端不冲突。

如果该值不存在,那么您只需返回之前通过update发送的值。

this.af.database.object('/users/' + newUser.name).$ref.transaction(currentValue => {
  if (currentValue === null) {
    return {email: 'johndoe@example.com', password: '!@#$1234'};
  } else {
    console.log('This username is taken. Try another one');
    return Promise.reject(Error('username is taken'))
  }
})
.then( result => {
   // Good to go, user does not exist
   if (result.committed) {
      // TODO: Take additional action
   }
})
.catch( error => {
   // handle error
});

请注意,这是Firebase API(而非Angularfire2)中的一种方法,但您仍然可以通过调用$ref来访问这些方法。

答案 1 :(得分:3)

我知道这是一个古老的问题,但是我使用AngaularFire4时遇到了类似的问题,所以张贴这个以帮助其他人:

this.db.object(`/users/${uid}`).first().subscribe(x => {
    if (x.$exists()){
          console.log(`FOUND`,x);
    }else {
          console.log(`NOT FOUND`);
    }
});
}

答案 2 :(得分:0)

 this.realtimedbService.getOneItem(key,  'colection').valueChanges()
              .subscribe(
                  result => {
                      if (result === null) {
                          console.log('NOT EXIST');

                                     }
                      if (result !== null) {
                        console.log('EXIST');
                        /// PUT YOUR UPPDATE METHODE HERE

                      }
                  },
                  error => {
                      console.log(" EE : ");
                      console.log(error);
                  }
              );