1

我正在使用 React JS 和 Firebase 创建一个聊天应用程序,其中我有一组组,在其中我们为每个组分别收集消息。对于在 Firestore 中添加新组,它可以正常工作,但是当我向相应的集合添加新消息时,它会显示此错误:

Uncaught (in promise) Error: FIRESTORE (8.8.0) INTERNAL ASSERTION FAILED: Unexpected 
state
at O (prebuilt-e10b3b00-01f089b3.js:287)
at ce (prebuilt-e10b3b00-01f089b3.js:1978)
at prebuilt-e10b3b00-01f089b3.js:1957
at comparator (prebuilt-e10b3b00-01f089b3.js:11535)
at t.insert (prebuilt-e10b3b00-01f089b3.js:2825)
at t.insert (prebuilt-e10b3b00-01f089b3.js:2668)
at t.add (prebuilt-e10b3b00-01f089b3.js:11579)
at prebuilt-e10b3b00-01f089b3.js:12042
at t.inorderTraversal (prebuilt-e10b3b00-01f089b3.js:2802)
at t.inorderTraversal (prebuilt-e10b3b00-01f089b3.js:2720)
at t._o (prebuilt-e10b3b00-01f089b3.js:12016)
at prebuilt-e10b3b00-01f089b3.js:12338
at step (tslib.es6.js:102)
at Object.next (tslib.es6.js:83)
at tslib.es6.js:76
at new Promise (<anonymous>)
at __awaiter (tslib.es6.js:72)
at prebuilt-e10b3b00-01f089b3.js:12333
at t.Oo (prebuilt-e10b3b00-01f089b3.js:12357)
at prebuilt-e10b3b00-01f089b3.js:12808
at prebuilt-e10b3b00-01f089b3.js:6794
at G (prebuilt-e10b3b00-01f089b3.js:598)
at t.forEach (prebuilt-e10b3b00-01f089b3.js:6791)
at prebuilt-e10b3b00-01f089b3.js:12807
at step (tslib.es6.js:102)
at Object.next (tslib.es6.js:83)
at tslib.es6.js:76
at new Promise (<anonymous>)
at __awaiter (tslib.es6.js:72)
at Ys (prebuilt-e10b3b00-01f089b3.js:12802)
at prebuilt-e10b3b00-01f089b3.js:12462
at step (tslib.es6.js:102)
at Object.next (tslib.es6.js:83)
at fulfilled (tslib.es6.js:73)

我在整个互联网上进行了搜索,并开始知道timeStamp可能是这个问题造成的。任何形式的帮助将不胜感激。

这是我的代码:

const ChatInput = ({ roomId }) => {
const [showKeyboard, setShowKeyboard] = useState(false);
const [message, setMessage] = useState('');
const emoRef = useRef(null);

const onEmojiClick = (event, emojiObject) => {
    setMessage(message + emojiObject?.emoji);
};

// useEffect(() => {
//  if (message === '') {
//      inputRef.current.focus();
//  }
// }, []);

const sendMessage = (e) => {
    e.preventDefault();

    // console.log(message);

    db.collection('rooms').doc(roomId).collection('messages').add({
        message,
        user: 'Remy Sharp',
        userImage:
            'https://www.webxcreation.com/event-recruitment/images/profile-1.jpg',
        timeStamp: firebase.firestore.FieldValue.serverTimestamp(),
    });

    setMessage('');
};

return (
    <ChatInputWrapper>
        <Tooltip title="Emoji" TransitionComponent={Zoom}>
            <Emoji onClick={() => setShowKeyboard(!showKeyboard)}>
                <InsertEmoticonIcon />
            </Emoji>
        </Tooltip>
        <EmojiKeyboard ref={emoRef} show={showKeyboard}>
            <Picker onEmojiClick={onEmojiClick} />
        </EmojiKeyboard>

        <ChatForm onSubmit={sendMessage}>
            <ChatText
                value={message}
                onChange={(e) => setMessage(e.target.value)}
                placeholder="Type a message ..."
            />
            <Tooltip title="Send" TransitionComponent={Zoom}>
                <ChatSend type="submit" onClick={sendMessage}>
                    <SendIcon />
                </ChatSend>
            </Tooltip>
        </ChatForm>
    </ChatInputWrapper>
);
};

export default ChatInput;

这是 firebase.js :

import firebase from 'firebase';
var firebaseConfig = {
apiKey: '',
authDomain: '',
projectId: '',
storageBucket: '',
messagingSenderId: '',
appId: '1::web:',
measurementId: 'G',
};

const firebaseApp = firebase.initializeApp(firebaseConfig);
const db = firebaseApp.firestore();
const auth = firebase.auth();
const provider = new firebase.auth.GoogleAuthProvider();

export { db, auth, provider };
4

2 回答 2

1

这是因为通过做

export { db, auth, provider };

你不出口firebaseApp(也不firebase),因此

firebase.firestore.FieldValue.serverTimestamp();

产生错误。


我建议你这样做:

在 firebase.js 中:

import firebase from 'firebase';
var firebaseConfig = {
  // ...
};

const firebaseApp = firebase.initializeApp(firebaseConfig);
const db = firebaseApp.firestore();
const fv = firebase.firestore.fieldValue;  // <=
const auth = firebase.auth();
const provider = new firebase.auth.GoogleAuthProvider();

export { db, fv, auth, provider };

写入 Firestore 时:

db.collection('rooms').doc(roomId).collection('messages').add({
        // ...
        timeStamp: fv.serverTimestamp(),
    });
于 2021-07-26T07:35:23.890 回答
0

FieldValues,例如FieldValue.serverTimestamp(),是可以在使用set()orupdate()方法编写文档字段时使用的标记值。

如果您想在该add()方法中使用时间戳,则可以firebase.firestore.Timestamp.now()改用。

于 2021-07-26T06:01:49.140 回答