Ошибка: не удалось сериализовать объект типа «FireStore» - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь запустить функцию Firebase, которая просто добавляет строку в документ базы данных (сохранение товара в корзину). Действие не завершается, и я получаю интересное сообщение об ошибке.

const cartItem = "Product name"

firebase.functions().httpsCallable('addToCart')({ cartItem })

И в моем индексе функций. js:

exports.addToCart = functions.https.onCall((data, context) => {
    const userID = context.auth.uid
    cartItem = data.cartItem
    const cartDoc = db.doc(`/carts/${userID}`)
    cartDoc.set({
        ...cartDoc,
        items: [cartItem]
    })

})

И это мое сообщение об ошибке в Firebase console:

Unhandled error Error: Value for argument "data" is not a valid Firestore document. Couldn't serialize object of type "Firestore" (found in field "_firestore"). Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the "new" operator).
    at Object.validateUserInput (/srv/node_modules/@google-cloud/firestore/build/src/serializer.js:301:15)
    at validateDocumentData (/srv/node_modules/@google-cloud/firestore/build/src/write-batch.js:620:22)
    at WriteBatch.set (/srv/node_modules/@google-cloud/firestore/build/src/write-batch.js:234:9)
    at DocumentReference.set (/srv/node_modules/@google-cloud/firestore/build/src/reference.js:340:14)
    at exports.addToCart.functions.https.onCall (/srv/index.js:258:13)
    at func (/srv/node_modules/firebase-functions/lib/providers/https.js:267:32)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

Он говорит, что не может сериализовать объект типа "Firestore", найденный в поле "_firestore". Я нахожу это довольно загадочным. Кроме того, этот синтаксис прекрасно работает в других моих функциях, которые пишут в документы базы данных. Я попытался передать строку напрямую, например, ('addToCart')('Product_Name'), и я также попытался явно указать прототип, как я видел это в других сообщениях, например, ({cartItem: 'Product_Name', __proto__: Object}), и я также попытался обновить свои зависимости.

Любые мысли будут с благодарностью, спасибо.

1 Ответ

0 голосов
/ 04 мая 2020

Этот код не имеет никакого смысла вообще:

const cartDoc = db.doc(`/carts/${userID}`)
cartDoc.set({
    ...cartDoc,
    items: [cartItem]
})

, если вы хотите установить документ на основе его текущих значений поля, вам нужно сначала get() этот документ, а затем установить его data() вернуться в базу данных.

Но нет необходимости загружать данные документа, если вы просто хотите обновить поле. Вместо этого вы можете обновить его с помощью:

cartDoc.update({ items: [cartItem] })

Если поле items является массивом, к которому вы хотите добавить новый элемент, вам нужно использовать arrayUnion вместо этого, вот так:

cartDoc.update({ items: firebase.firestore.FieldValue.arrayUnion(cartItem) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...