我正在使用firebase phone authentication
对Firebase上的用户进行身份验证。工作正常,在成功通过xyz电话号码对用户进行身份验证之后,现在我想将电话号码更新为abc,简而言之,我正在尝试更新用户的手机号码。
我发现Firebase Web API可以更新用户现有的手机号码,如下所示。
以下功能将在用户要注册的新电话号码上发送otp。
function sentOTPToNewNumber() {
var phoneNumber = document.getElementById("newPhone").value;
var appVerifier = window.recaptchaVerifier;
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
.then(function (confirmationResult) {
// SMS sent. Prompt user to type the code from the message, then sign the
// user in with confirmationResult.confirm(code).
window.confirmationResult = confirmationResult;
}).catch(function (error) {
console.log(error)
});
}
在收到新号码的otp后,我们必须验证遵循该功能的号码是否正确。
function codeVerification() {
var verificationCode = document.getElementById("verification").value;
try {
//at this line i am facing issue.
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, verificationCode)
console.log(credential);
var result = userLocal.updatePhoneNumber(credential);
console.log(result);
} catch (error) {
console.log(error);
}
}
如果用户在codeVerification函数中输入错误的otp,我想处理错误。当我们尝试输入错误的otp时,我们正在使用的以下api引发错误,但是我无法处理try catch
块内的错误
firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, verificationCode)
我在google firebase上找到了以下描述,但无法理解如何处理错误。我实现的try catch
块未捕获到Firebase引发的错误。我也尝试使用then(function(){}).catch(function(error){})
,它说那不是函数。
以下错误,我进入我要处理的控制台。 注意:如果用户输入正确的otp,我就能成功更新用户电话号码。唯一的问题是我想处理代码不正确的情况,或者想知道更新是否成功。
感谢您的时间和支持,这将非常有帮助。
答案 0 :(得分:1)
userLocal.updatePhoneNumber(credential)
调用返回一个Promise
对象(请参见updatePhoneNumber
docs),如果出现问题,该对象将被拒绝。但是,您尝试捕获此错误的方法不正确,这就是为什么您无法正确处理该错误的原因。
要处理Promise
拒绝,请在.then().catch()
之后链接userLocal.updatePhoneNumber
,如下所示:
userLocal.updatePhoneNumber(credential)
.then(/* Update successful */)
.catch(function(error) {
// Update failed
});
如果您在代码中使用async/await
,则可以保留当前拥有的try-catch
代码,但是请执行以下更改:
codeVerification
为async
函数await
到userLocal.updatePhoneNumber
的通话async function codeVerification() {
...
try {
...
var result = await userLocal.updatePhoneNumber(credential);
// ^^^^^ notice the `await` keyword above
// Update successful
} catch (error) {
// Update failed
}
}
以上两种解决方案基本相同,只是语法不同。