【问题标题】:React - Firebase - RecaptchaVerifier is not a constructorReact - Firebase - RecaptchaVerifier 不是构造函数
【发布时间】:2020-02-19 11:26:28
【问题描述】:

我正在尝试创建一个使用“onSubmit”按钮触发handleSignUp() 的React 应用程序。但是,每次我调用handleSignUp() 时都会出现此错误

类型错误: _base__WEBPACK_IMPORTED_MODULE_2__.default.auth.RecaptchaVerifier 不是构造函数

firebase 初始化 -base.js

import * as firebase from "firebase/app";
import "firebase/auth";

const app = firebase.initializeApp({
  apiKey: process.env.REACT_APP_FIREBASE_KEY,
  authDomain: process.env.REACT_APP_FIREBASE_DOMAIN,
  databaseURL: process.env.REACT_APP_FIREBASE_DATABASE,
  projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
  storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.REACT_APP_FIREBASE_SENDER_ID
});

export default app;

SignUp.js

import React, { Component } from "react";
import { withRouter } from "react-router";
import app from "./base";

class SignUp extends Component {
  componentDidMount() {
    window.recaptchaVerifier = new app.auth.RecaptchaVerifier(this.recaptcha, {
      size: "normal",
      callback: function(response) {
        console.log("reCAPTCHA solved, allow signInWithPhoneNumber.");
      },
      "expired-callback": function() {
        console.log("Response expired. Ask user to solve reCAPTCHA again.");
      }
    });
    window.recaptchaVerifier.render().then(function(widgetId) {
      window.recaptchaWidgetId = widgetId;
    });
  }

  handleSignUp = async () => {
    var phoneNumber = "+16505554567";
    var appVerifier = new app.auth.RecaptchaVerifier("recaptcha-container");

    try {
      await app
        .auth()
        .signInWithPhoneNumber(phoneNumber, appVerifier)
        .then(function(confirmationResult) {
          window.confirmationResult = confirmationResult;
        });
    } catch (error) {
      alert(error);
    }
  };
  render() {
    return (
      <div ref={ref => (this.recaptcha = ref)}>
        <h1>Sign up</h1>
        <form onSubmit={this.handleSignUp}>
          <button type="submit">Sign Up</button>
        </form>
      </div>
    );
  }
}

export default withRouter(SignUp);

同时运行var appVerifier = new app.auth.RecaptchaVerifier("recaptcha-container");自动刷新网页

【问题讨论】:

  • 你能发布解决方案吗?

标签: javascript reactjs firebase firebase-authentication


【解决方案1】:

我在这上面花了 3 个小时,终于找到了问题所在。 当您像

这样初始化firebase应用程序时
app.initializeApp(config);

然后您可以使用以下方法调用方法:app.auth()

app.auth().createUserWithEmailAndPassword(email, password);

要创建 RecaptchaVerifier 实例,您必须使用:app.auth

window.recaptchaVerifier = new app.auth.RecaptchaVerifier('captcha-container', {
        'size': 'invisible'
    });

【讨论】:

    【解决方案2】:

    RecaptchaVerifier 构造函数驻留在firebase.auth 中。您需要将window.recaptchaVerifier 作为第二个参数传递给signInWithPhoneNumber

    【讨论】:

      【解决方案3】:

      我也遇到了这个问题并解决了。此代码绝对有助于使用 firebase 电话身份验证登录

      Firebase.js

      import * as Firebase from 'firebase';
      
      const app = firebase.initializeApp({
        apiKey: process.env.REACT_APP_FIREBASE_KEY,
        authDomain: process.env.REACT_APP_FIREBASE_DOMAIN,
        databaseURL: process.env.REACT_APP_FIREBASE_DATABASE,
        projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
        storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
        messagingSenderId: process.env.REACT_APP_FIREBASE_SENDER_ID
      });
      Firebase.initializeApp(app);
      export default Firebase;
      

      signup.js

          import React, { useState  } from 'react';
          import Firebase from './container/Firebase';
          import 'react-phone-number-input/style.css'
          import PhoneInput from 'react-phone-number-input'
      
          const Signup= () => {
      
          const [value, setValue] = useState(0);
      
      function setuprecaptcha (){
          window.recaptchaVerifier = new Firebase.auth.RecaptchaVerifier('recaptcha-container', {
              size: 'invisible',
              callback: function (response) {
                  console.log("recature resolved")
                  this.onSignInSubmit();
              }
          });
      
      }
      
       
      function onSignInSubmit(event) {
          
          event.preventDefault();
          setuprecaptcha();
          var phoneNumber = value;
          var appVerifier = window.recaptchaVerifier;
          Firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
              .then(function (confirmationResult) {
                  console.log("Success");
                  // SMS sent. Prompt user to type the code from the message, then sign the
                  // user in with confirmationResult.confirm(code).
                  window.confirmationResult = confirmationResult;
                  var verificationId = window.prompt("Enter otp")
                  confirmationResult
                      .confirm(verificationId)
                      .then(function (result) {
                          // User signed in successfully.
                          var user = result.user;
                          user.getIdToken().then(idToken => {
                              window.localStorage.setItem('idToken', idToken);
      
                             
                              console.log(idToken);
                          });
                      })
                      .catch(function (error) {
                          // User couldn't sign in (bad verification code?)
                          console.error("Error while checking the verification code", error);
                          window.alert(
                              "Error while checking the verification code:\n\n" +
                              error.code +
                              "\n\n" +
                              error.message
                          );
                      });
      
              })
              .catch(function (error) {
                  console.log("sign Up error:" + error.code);
              });
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 1970-01-01
        • 2020-03-30
        • 2021-10-16
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        相关资源
        最近更新 更多