我们说我正在收集用户名,我想检查一下我的Firebase数据库中是否已存在此用户名。 AngularFire2 update
或set
方法实际上并未检查对象是否存在,但如果存在,则替换它。有没有办法检查并说出返回一个可观察到的错误?
目前我的解决方案是检索对象,如果有结果,我知道它存在。我正在寻找一种更简单的方法来检查它。
我需要将其作为数据库对象,而不是身份验证中的实际用户。
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'
})
}
});
答案 0 :(得分:7)
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);
}
);