#typescript #firebase #google-cloud-firestore #next.js
#typescript #firebase #google-облако-firestore #next.js
Вопрос:
У меня есть следующий код:
import { DocumentReference } from '@firebase/firestore-types'
export type Recipe = {
author: string
title: string
ingredients: {
quantity: number
ingredient: DocumentReference["path"]
}[]
instructions: string[]
}
export const getAllRecipes = async() => {
const snapshot = await db.collection('recipes').get()
const data = snapshot.docs.map(doc => doc.data())
return data
}
const recipes: Recipe[] = await getAllRecipes()
По какой-то причине я не могу получить правильный тип для ингредиентов.
Ошибка, которую я получил, такова:
Error: Error serializing .recipes[0].ingredients[0].ingredient returned from getStaticProps in "/".
Как определить тип в массиве ссылок из firestore
в typescript
?
Кроме того, если я это сделаю (только для отладки)
export const getAllRecipes = async() => {
const snapshot = await db.collection('recipes').get()
const data = snapshot.docs.map(doc => {
const docData = doc.data()
const {ingredients} = docData
ingredients.map((ingredient: DocumentReference) => {
const jsonIngredient = ingredient.path
console.log(jsonIngredient)
})
return docData
})
return data
}
Комментарии:
1. Какая строка кода генерирует эту ошибку? Я не вижу никакого кода, который вообще что-либо сериализует. Я также не вижу, где вы используете тип Recipes. Я предлагаю отредактировать вопрос, чтобы добавить весь соответствующий код, а также объяснить, что вы ожидаете от кода вместо генерации этой ошибки.
2. @DougStevenson добавил больше кода. Однако, может быть просто простой вызов, который определяет тип, не нужно его записывать, учитывая, что функция вызова уже есть. Например, const recipes: Recipes[] = ожидает получения всех рецептов()
3. Это весь код, который вы используете? Я все еще не вижу никакой сериализации. Какая строка кода вызывает ошибку?
4. @DougStevenson в последней строке обратите внимание, что тег включает Nextjs, поэтому ошибка, возникающая при вызове await getAllRecipes() и сериализованная из getStaticProps. Я обновил сообщение об ошибке полностью
5. Как выглядят ваши документы? Это были бы фактические данные, верно?
Ответ №1:
Я сильно подозреваю, что сериализация по умолчанию в формате toJSON объекта DocumentReference (который является сложным объектом со ссылками на другие объекты Firestore) просто не будет работать так, как вы хотите. Если вы хотите, чтобы вызывающий объект имел DocumentReference, вам придется преобразовать каждый из них в путь к строке, используя его свойство path, а затем перестроить путь в ссылку с помощьюFirestore.doc (путь). Тип TypeScript вообще не имеет значения — это просто уровень понимания базового набора объектов.
Комментарии:
1. Как я могу получить путь? Поскольку я ввел приведенный выше код, я не получил пути, они по какой-то причине не определены?
2. Как я ссылался в своем ответе, если у вас есть объект DocumentReference, вы можете использовать его собственный путь. Я не могу объяснить, почему у вас где-то есть неопределенное значение. Это вообще не привело бы к сериализации события. Вам придется покопаться в моментальном снимке документа и каким-то образом добраться до реальных ссылочных объектов.