2016-12-27 2 views
3

Предположим, что я собираю имя пользователя, и я хочу проверить, существует ли это имя пользователя в моей базе данных 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' 
    }) 
    } 
}); 

ответ

5

Firebase Transaction

Firebase предоставляет метод 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 
}); 

Важно отметить, что это метод из Firebase API (не Angularfire2), но вы все еще можете получить доступ к этим методам, вызвав $ref.

+0

Спасибо! @adriancarriger. Оно работает!!. Я добавил некоторые дополнительные детали в реализацию. –

+0

Удивительный, рад, что это помогло! – adriancarriger

+0

Приведенный выше код работает для добавления нового объекта. Но попробуйте использовать его также для удаления с помощью 'currentValue.remove()', но получение currentValue.remove не является функцией. Как я могу удалить? – alltej

3

Я знаю, что это старый вопрос, но у меня была аналогичная проблема с использованием AngaularFire4 так отправляю это, чтобы помочь кому-либо еще:

this.db.object(`/users/${uid}`).first().subscribe(x => { 
    if (x.$exists()){ 
      console.log(`FOUND`,x); 
    }else { 
      console.log(`NOT FOUND`); 
    } 
}); 
} 
Смежные вопросы