FirebaseError: Ожидается, что первым аргументом collection() будет ссылка на коллекцию, ссылка на документ или хранилище FirebaseFirestore

# #javascript #firebase #google-cloud-firestore

Вопрос:

Я пытаюсь создать переменную для ссылки на документ Firestore.

 const userRef = doc(db, 'users', uid)
 

и используйте его, добавив прослушиватель в реальном времени

 onSnapshot(userRef,  (doc) => {
        if (doc.exists()){
            setCode(code = doc.data().keycode)
        } else {
            setCode(code = 'N/A')
        }
    })
 

Но он получает эту ошибку

 FirebaseError: Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore
 

Сначала я подумал, что это потому, что uid неверен, поэтому я жестко закодировал его и все равно получил ту же ошибку.

Вот полный код, это компонент react. Я импортировал конфигурацию firebase из App.js

 import React, { useState } from 'react'

import { onSnapshot, doc, getFirestore } from 'firebase/firestore'

function Transaction(uid, firebase) {
    const db = getFirestore(firebase);

    let [amount, setAmount] = useState('')
    let [target, setTarget] = useState('')
    let [code, setCode] = useState('')

    const userRef = doc(db, 'users', uid)
    
    const sendNum = async(e) => {
        e.preventDefault();
        console.log('Send Num')
    }

    const generateCode = async(e) => {
        e.preventDefault();
        console.log('Generate Code')
    }


    onSnapshot(userRef,  (doc) => {
        if (doc.exists()){
            setCode(code = doc.data().keycode)
        } else {
            setCode(code = 'N/A')
        }
    })

    return (
        <>
            <form onSubmit={sendNum}>
                <input style={{ width: 200 }}value={amount} onChange={(e) => setAmount(e.target.value)} type="number" placeholder='Amount'/>
                <input style={{ width: 200 }} value={target} onChange={(e) => setTarget(e.target.value)} type="number" placeholder='Keycode'/>
                <br />
                <button className='btn' type='submit'>Send</button>
            </form>
 
            <section>
                <h2>{code}</h2>
                <button className='btn' onClick={generateCode} type='submit'>Generate Code</button>
            </section>
        </>
    )
}

export default Transaction

 

Я использовал маршрутизатор React и передал туда реквизит.

 const firebaseConfig = {
  apiKey: "AIzaSyAKLyeY2FbjFDD57Kp9sGDi8uHg3neXxjI",
  authDomain: "digitots-dev.firebaseapp.com",
  projectId: "digitots-dev",
  storageBucket: "digitots-dev.appspot.com",
  messagingSenderId: "150130182744",
  appId: "1:150130182744:web:216e77264273772c94182d",
  measurementId: "G-RJT8Q1LSXZ"
};

const firebaseApp = initializeApp(firebaseConfig);
const auth = getAuth();
const db = getFirestore();
const provider = new GoogleAuthProvider();

let uid = ''

function App() {
  
  
  return (
    <div className="App">
      
      <header>
        <Router>
          <Nav />
          
          <Switch>
            
            <Route path='/' exact component={MainView} />
            <Route path="/about" component={About}/>
            <Route path='/shop' component={Shop}/>
            <Route path='/admin' component={Admin}/>
            
            <Route
              path='/portal'
              render={(props) => (
                <Transaction {...props}  db={db} uid={uid} firebase={firebaseConfig}/>
              )}
            />
            

          </Switch>
           
        </Router>
      </header>

      
    </div>
  );
}
 

введите описание изображения здесь

Ответ №1:

По-видимому, ошибка говорит Expected first argument to collection() , даже если вы передаете недопустимые аргументы doc() . Это, как говорится, db не определено или не является экземпляром Firestore. Убедитесь, что вы импортируете db из файла, в котором вы инициализируете Firestore, или он определен в том же файле:

 import { getFirestore, doc } from "firebase/firestore"

const db = getFirestore(app) // const app = initializeApp(fireConfig)

const userRef = doc(db, 'users', uid)
 

Об TypeError: Cannot read property 'getProvider' of undefined ошибке:

 <Transaction {...props}  db={db} uid={uid} firebase={firebaseConfig}/>
 

Вы передаете конфигурацию Firebase (объект JSON) в getFirestore() качестве параметра, в то время как он ожидает экземпляр приложения Firebase.

 // Incorrect
const db = getFirestore(firebase);


// Correct
const db = getFirestore(firebaseApp)
 

Измените компонент транзакции на:

 <Transaction {...props} uid={uid} firebase={firebaseApp}/>
 

Комментарии:

1. Я сделал это, и теперь у него просто ошибка типа Ошибка: Не удается прочитать свойство «getProvider» неопределенного

2. @PathonScript не могли бы вы обновить свой вопрос с помощью последнего имеющегося у вас кода и скриншота ошибки? Эта ошибка, похоже, где-то в другом месте.

3. Конечно, я так и сделал 🙂

4. @PathonScript Я не вижу ни одного снимка экрана с ошибками. Можете ли вы поделиться одним из них, включая журналы ? Сначала нам нужно проверить, откуда он исходит.

5. о, ладно, я совсем забыл об этом.