我正在开发一个聊天消息功能,但我被控制台中的这个错误难住了:messagesRef.orderBy is not a function

以下是我当前的代码:

firebase.js

import firebase from 'firebase/compat/app'
import 'firebase/compat/auth'
import "firebase/compat/storage";
import { getStorage } from "firebase/storage";
import { getFirestore } from "firebase/firestore"

const app = firebase.initializeApp({
    apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
    authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
    projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
    storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGE_SENDER_ID,
    appId: process.env.REACT_APP_FIREBASE_APP_ID
})

export const auth = app.auth()
export const storage = getStorage(app);
export const db = getFirestore(app);
export default app

Messages.jsx

import React, { useState, useEffect } from "react";
import { auth, db } from "../firebase"
import { collection, getDocs } from "firebase/firestore";

const Messaging = () => {
  const [user, setUser] = useState(null);
  const [text, setText] = useState("");
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const unsubscribe = auth.onAuthStateChanged((user) => {
      if (user) {
        setUser(user);
      } else {
        setUser(null);
      }
    });

    const messagesRef = collection(db, "messages");
    messagesRef.orderBy("createdAt").onSnapshot((snapshot) => {
      const messagesList = snapshot.docs.map((doc) => ({
        ...doc.data(),
        id: doc.id,
      }));
      setMessages(messagesList);
    });
    return () => {
      unsubscribe();
    };
  }, []);

  const handleTextChange = (e) => {
    setText(e.target.value);
  };

  const handleSend = () => {
    const newMessage = {
      text,
      createdAt: new Date(),
      userId: user.uid,
    };
    db.collection("messages").add(newMessage);
    setText("");
  };

  return (
    <>
      <div>
        {user ? (
          <div>
            <div>
              {messages.map((message) => (
                <div key={message.id}>
                  <p>{message.text}</p>
                </div>
              ))}
            </div>
            <div>
              <input value={text} onChange={handleTextChange} />
              <button onClick={handleSend}>Send</button>
            </div>
          </div>
        ) : (
          <button onClick={() => auth.signInAnonymously()}>Sign In</button>
        )}
      </div>
    </>
  );
};

export default Messaging;

我的假设是,这些Collection 没有正确导入,但我已经try 了collection(db, "messages")db.collection("messages"),我不确定从哪里开始.

感谢您提供的任何意见!

此外,我已经知道我不应该导入/Compat库,但是我在没有它的情况下得到了一个错误,所以这一点没有改变.

推荐答案

您将从新的(ISH)模块化SDK导入getFirestore,这意味着像orderBy这样的功能是顶级函数,而不是引用上的方法.因此,如果我们遵循文档中关于ordering data的代码样例,这意味着您的代码应该是:

import { collection, getDocs, onSnapshot, query, orderBy } from "firebase/firestore";

    ...

    const messagesRef = collection(db, "messages");
    onSnapshot(query(messagesRef, orderBy("createdAt")), (snapshot) => {
      ...
    });

Javascript相关问答推荐

RxJS setTimeout操作符等效

React存档iframe点击行为

为什么从liveWire info js代码传递数组我出现错误?

从mat—country—select获取整个Country数组

微软Edge编辑和重新发送未显示""

Chrome是否忽略WebAuthentication userVerification设置?""

如何为我的astro页面中的相同组件自动创建不同的内容?

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

更改JSON中使用AJAX返回的图像的路径

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

如何在使用rhandsontable生成表时扩展数字输入验证?

如何将数组用作复合函数参数?

DOM不自动更新,尽管运行倒计时TS,JS

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

无法使用npm install安装react-dom、react和next

更新文本区域行号

使用静态函数保存 node 前的钩子

ReactJS在类组件中更新上下文

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

带元素数组的Mongo聚合