如何处理firebase.auth.PhoneAuthProvider.credential错误

时间:2019-01-10 07:39:14

标签: javascript firebase error-handling firebase-authentication

我正在使用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){}),它说那不是函数。 enter image description here

以下错误,我进入我要处理的控制台。 注意:如果用户输入正确的otp,我就能成功更新用户电话号码。唯一的问题是我想处理代码不正确的情况,或者想知道更新是否成功。

enter image description here

感谢您的时间和支持,这将非常有帮助。

1 个答案:

答案 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代码,但是请执行以下更改:

  1. 使codeVerificationasync函数
  2. awaituserLocal.updatePhoneNumber的通话
async function codeVerification() {
    ...
    try {
        ...
        var result = await userLocal.updatePhoneNumber(credential); 
        //           ^^^^^ notice the `await` keyword above
        // Update successful
    } catch (error) {
        // Update failed
    }
}

以上两种解决方案基本相同,只是语法不同。