“string”类型的参数不可分配给“Auth”类型的参数

问题描述 投票:0回答:1

我尝试在 firebase nextjs 中进行电话身份验证,但收到打字稿错误,因为“字符串”类型的参数不可分配给“Auth”类型的参数。

以下是我从 env.local 获取数据的 firebase 配置文件

// firebaseConfig.ts
import { initializeApp, FirebaseApp } from "firebase/app";
import { getAuth, Auth } from "firebase/auth";
import { getAnalytics, Analytics } from "firebase/analytics";
import { getFirestore, Firestore } from "firebase/firestore";

const firebaseConfig = {
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  databaseURL: process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
  storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
  measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
};

// Initialize Firebase
const app: FirebaseApp = initializeApp(firebaseConfig);
const analytics: Analytics = getAnalytics(app);
const auth: Auth = getAuth(app);
const db: Firestore = getFirestore(app);

export { app, analytics, auth, db };

以下是出现电话验证重新验证错误的代码

import React, { useState } from "react";
import { RecaptchaVerifier, signInWithPhoneNumber, Auth } from "firebase/auth";
import { auth } from "@/app/lib/firebaseConfig"; // Ensure this path is correct
import CountrySelect from "./CountrySelect";
import PhoneNumberField from "./phoneNumber";
import { Country } from "@/app/types/types";

declare global {
  interface Window {
    confirmationResult: any;
  }
}

export interface PhoneWithCountryProps {
  setSelectedCountry: (country: Country | null) => void;
  selectedCountry: Country | null;
  setOtpState: React.Dispatch<React.SetStateAction<boolean>>;
  savedPhone: string;
  setSavedPhone: React.Dispatch<React.SetStateAction<string>>;
}

const validatePhoneNumber = (country: Country, number: string): boolean => {
  const countryCode = country.phone;

  switch (countryCode) {
    case "91":
      const indiaRegex = /^[6-9]\d{9}$/;
      return indiaRegex.test(number) && number !== "9876543210";

    case "971":
      const uaeRegex = /^5\d{8}$/;
      return uaeRegex.test(number);

    case "94":
      const sriLankaRegex = /^7\d{8}$/;
      return sriLankaRegex.test(number);

    case "968":
      const omanRegex = /^7\d{7}$/;
      return omanRegex.test(number);

    case "966":
      const saudiArabiaRegex = /^5\d{8}$/;
      return saudiArabiaRegex.test(number);

    default:
      return false;
  }
};

const PhoneWithCountry: React.FC<PhoneWithCountryProps> = ({
  setSelectedCountry,
  selectedCountry,
  setOtpState,
  savedPhone,
  setSavedPhone,
}) => {
  const [phone, setPhone] = useState("");
  const [error, setError] = useState("");

  const handleForwardButtonClick = () => {
    if (
      !error &&
      selectedCountry &&
      validatePhoneNumber(selectedCountry, phone)
    ) {
      const appVerifier = new RecaptchaVerifier(
        "recaptcha-container", -- this line is giving error --
        {
          size: "invisible",
        },
        auth
      );

      const phoneNumber = `+${selectedCountry.phone}${phone}`;

      signInWithPhoneNumber(auth, phoneNumber, appVerifier)
        .then((confirmationResult) => {
          setSavedPhone(phone);
          setOtpState(true);
          // Store confirmationResult to verify the OTP later
          window.confirmationResult = confirmationResult;
        })
        .catch((error) => {
          setError("Failed to send OTP. Please try again.");
          console.error("Error during signInWithPhoneNumber:", error);
        });
    }
  };

  return (
    <>
      <div className="flex">
        <CountrySelect
          setSelectedCountry={setSelectedCountry}
          selectedCountry={selectedCountry}
        />
        <PhoneNumberField
          initialPhone={savedPhone}
          setPhone={setPhone}
          error={error}
          setError={setError}
          selectedCountry={selectedCountry}
          setOtpState={setOtpState}
          validatePhoneNumber={validatePhoneNumber}
          handleForwardButtonClick={handleForwardButtonClick}
        />
      </div>
      <div id="recaptcha-container"></div>
    </>
  );
};

export default PhoneWithCountry;

错误发生在这里:

      const appVerifier = new RecaptchaVerifier(
        "recaptcha-container", -- this line is giving error --
        {
          size: "invisible",
        },
        auth
      );
javascript firebase next.js firebase-authentication
1个回答
0
投票

您没有正确使用

RecaptchaVerifier
API。 请参阅 API 文档了解 RecaptchaVerifier 构造函数

constructor(
    authExtern: Auth,
    containerOrId: HTMLElement | string,
    parameters?: RecaptchaParameters
);

可以看到Auth参数排在第一位。 您传递的参数无序。 应该是这样的:

const appVerifier = new RecaptchaVerifier(
    auth,
    "recaptcha-container",
    { size: "invisible" },
);
© www.soinside.com 2019 - 2024. All rights reserved.