Estoy tratando de convertir mi código de trabajo de la versión 8 a la versión 9, pero no puedo entender por qué recibo el error: 'FirebaseError: Tipo esperado 'Consulta', pero era: un objeto DocumentReference personalizado'. Parece que no es MessageRes, pero puse una consulta y creo que estoy obteniendo correctamente la subcolección.
version 8: working export async function getServerSideProps(context) { const chatRef = db.collection('chats').doc(context.query.id); const messagesRes = await chatRef .collection('messages') .orderBy('timestamp', 'asc') .get(); const messages = messagesRes.docs .map(doc => ({ id: doc.id, ...doc.data(), })) .map(messages => ({ ...messages, timestamp: messages.timestamp.toDate().getTime(), })); const chatRes = await chatRef.get(); const chat = { id: chatRes.id, ...chatRes.data(), }; return { props: { messages: JSON.stringify(messages), chat, }, }; } version 9: export async function getServerSideProps(context) { const chatRef = doc(db, 'chats', context.query.id); const messagesRes = await getDocs( query(collection(chatRef, 'messages'), orderBy('timestamp', 'asc')) ); const messages = messagesRes.docs .map(doc => ({ id: doc.id, ...doc.data(), })) .map(messages => ({ ...messages, timestamp: messages.timestamp.toDate().getTime(), })); const chatRes = await getDocs(chatRef); const chat = { id: chatRes.id, ...chatRes.data(), }; return { props: { messages: JSON.stringify(messages), chat, }, }; }Según la documentación de la API :
export declare function getDocs<T>(query: Query<T>): Promise<QuerySnapshot<T>>;Y en tu código estás haciendo:
const chatRes = await getDocs(chatRef);Es por eso que está viendo el error:
'FirebaseError: se esperaba el tipo 'Consulta', pero era: un objeto DocumentReference personalizado'.
porque está pasando la referencia de su documento y no una consulta .
Como hiciste aquí:
const messagesRes = await getDocs( query(collection(chatRef, 'messages'), orderBy('timestamp', 'asc')) );Puede ver el uso correcto de la API aquí .
No funcionó para mí, pero lo modifiqué un poco y usé las colecciones de firebase 9 y filtré la colección donde context.query.id es válido para SSR antes de que se cargue la página.
export async function getServerSideProps(context) { const chatID = context.query.id; const chatIDRef = collection(db, "chats"); //prep messages const messagesRes = await getDocs(chatIDRef, where(chatID, "==", chatID)); console.log("ctx log: ", messagesRes); const messages = messagesRes.docs .map((doc) => ({ id: doc.id, ...doc.data(), })) .map((messages) => ({ ...messages, timestamp: messages.timestamp?.toDate().getTime(), })); //prep chat const chatIDRef2 = doc(db, "chats", chatID); const chatRef = await getDoc(chatIDRef2); const chat = { id: chatRef.id, ...chatRef.data(), }; return { props: { messages: JSON.stringify(messages), chat: chat, }, }; }