AngularFire2 - 在更新之前检查对象是否存在
问题描述:
假设我正在收集用户名,并且我想检查这个用户名是否已经存在于我的Firebase数据库中。 AngularFire2 update
或set
方法实际上并不检查对象是否存在,但如果存在则替换它。有没有办法检查,并说返回一个可观察的错误?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
访问这些方法。
答
我知道这是一个老问题,但我用这样AngaularFire4张贴这帮助其他人有类似的问题:
this.db.object(`/users/${uid}`).first().subscribe(x => {
if (x.$exists()){
console.log(`FOUND`,x);
}else {
console.log(`NOT FOUND`);
}
});
}
谢谢! @adriancarriger。有用!!。我在实施中添加了一些额外的细节。 –
太棒了,很高兴帮助! – adriancarriger
上述代码适用于添加新对象。但是尝试使用它也可以通过'currentValue.remove()'去除,但是获取错误currentValue.remove不是函数。我怎样才能删除? – alltej