我需要实现与日期的聊天。我使用 firebase 作为后端。
收藏: 聊天 -> 2h73gbu3id933jeif883ue9(文档) -> 消息 -> [日期: x, m: [{}, {}, {}]]
因此,对于特定日期,它应该在
m
数组中添加消息,如果该日期是新的,则应该创建另一个 [date: x, m: [{}, {}, {}]]
代码:
const today = new Date();
const currentDay = today.toLocaleDateString("en-US", { weekday: "long" });
const docRef = doc(db, "chats", chat.chatId);
const docSnap = await getDoc(docRef);
const currentMessages = docSnap.data()?.messages || [];
const lastMessageDate =
currentMessages.length > 0 &&
currentMessages[currentMessages.length - 1].date.toDate();
const isSameDay =
lastMessageDate &&
lastMessageDate.toLocaleDateString("en-US", { weekday: "long" }) ===
currentDay;
if (!isSameDay) {
await updateDoc(docRef, {
messages: arrayUnion({
date: Timestamp.now(),
m: [{ uid: currentUser.uid, text: message, isSender: true }],
}),
});
} else {
const updatedItems = [
...currentMessages[currentMessages.length - 1].m,
{ uid: currentUser.uid, text: message, isSender: true },
];
await updateDoc(currentMessages, {
messages: arrayUnion({
date: lastMessageDate,
m: updatedItems,
}),
});
}
当我执行
isSameDate
true 的逻辑时,我得到:
'index.tsx:64 未捕获(承诺中)FirebaseError:预期类型'DocumentReference',但它是:一个数组'
这是因为你这样做
await updateDoc(currentMessages, {
messages: arrayUnion({
date: lastMessageDate,
m: updatedItems,
}),
});
其中
currentMessages
是一个数组。
您应该(可能)使用
DocumentReference
执行以下操作:
await updateDoc(docRef, {
messages: arrayUnion({
date: lastMessageDate,
m: updatedItems,
}),
});