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

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

问题描述:

假设我正在收集用户名,并且我想检查这个用户名是否已经存在于我的Firebase数据库中。 AngularFire2 updateset方法实际上并不检查对象是否存在,但如果存在则替换它。有没有办法检查,并说返回一个可观察的错误?AngularFire2 - 在更新之前检查对象是否存在

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

我需要做的是一个数据库对象,而不是身份验证中的实际用户。

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: '[email protected]', 
     password: '[email protected]#$1234' 
    }) 
    } 
}); 

火力地堡交易

火力地堡提供了这种情况transaction方法。

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

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

this.af.database.object('/users/' + newUser.name).$ref.transaction(currentValue => { 
    if (currentValue === null) { 
    return {email: '[email protected]', password: '[email protected]#$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 
}); 

重要的是要注意,这是从火力地堡API(未Angularfire2)的方法是很重要的,但你仍然可以通过调用$ref访问这些方法。

+0

谢谢! @adriancarriger。有用!!。我在实施中添加了一些额外的细节。 –

+0

太棒了,很高兴帮助! – adriancarriger

+0

上述代码适用于添加新对象。但是尝试使用它也可以通过'currentValue.remove()'去除,但是获取错误currentValue.remove不是函数。我怎样才能删除? – alltej

我知道这是一个老问题,但我用这样AngaularFire4张贴这帮助其他人有类似的问题:

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