typescript - Firebase molnfunktion - Ohanterat fel Fel: Update()


Har någon ett liknande problem när de försöker göra flera uppdateringar med batch? Här är min funktion:

admin.initializeApp();
const db = admin.firestore();
export const unfollowRemoveUser = functions.https.onCall((data, context) => {

        const user1id = data.user1
        const user2id = data.user2

        const user1DocRef = db.collection('users').doc(user1id)                 
    const user2DocRef = db.collection('users').doc(user2id)    

        const batch = db.batch();

        batch.update(user1DocRef, {followingNum : FieldValue.increment(-1)});
        batch.update(user2DocRef, {followersNum : FieldValue.increment(-1)});

        // Commit the batch
        return batch.commit().then(function () {
            // ...
        });


    });

Är det något fel på min funktion? Jag gör detta precis som i dokumentationsexemplet för batchade skrivningar. Jag får detta fel:

Ohanterat fel Fel: Update() kräver antingen ett enda JavaScript-objekt eller en alternerande lista med fält/värde-par som kan följas av en valfri förutsättning. Värdet för argumentet "dataOrField" är inte ett giltigt Firestore-dokument. Kunde inte serialisera objekt av typen "NumericIncrementTransform" (finns i fältet followingNum). Firestore stöder inte JavaScript-objekt med egna prototyper (dvs. objekt som skapats via "new"-operatorn).\n vid WriteBatch.update (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/write-batch.js:367:23)\n vid exports.unfollowRemoveUser.functions.https. onCall (/user_code/lib/index.js:131:11)\n vid /user_code/node_modules/firebase-functions/lib/providers/https.js:330:32\n vid next (native)\n vid /user_code/node_modules/firebase-functions/lib/providers/https.js:28:71\n vid __awaiter (/user_code/node_modules/firebase-functions/lib/providers/https.js:24:12)\n vid func (/user_code/node_modules/firebase-functions/lib/providers/https.js:294:32)\n vid corsHandler (/user_code/node_modules/firebase-functions/lib/providers/https.js:350:44)\n vid cors (/user_code/node_modules/firebase-functions/node_modules/cors/lib/index.js:188:7)\n vid /user_code/node_modules/firebase-functions/node_modules/cors/lib/index.js:224:17

Jag sökte och försökte allt jag kunde hitta men kunde inte lösa detta problem, jag försökte till och med använda enkel uppdatering av dokumentet men jag får samma fel.

REDIGERA Vad ska jag göra när jag vill att batch ska köras endast om alla operationer kan utföras framgångsrikt. Exempel: Om jag har de första två uppdateringarna på dokument som faktiskt finns, kommer de att uppdatera dessa värden med -1 och sedan två raderingsoperationer på dokument som inte finns, kommer detta inte att orsaka ett fel i min funktion (värdena kommer att uppdateras med -1 och raderingen kommer inte att göra något)

const batch = db.batch();
batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
        batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});

        batch.delete(user1FollowingDocRef); //this doesn't exist
        batch.delete(user2FollowersDocRef); //this doesn't exist

        return batch.commit();

Men om jag först har två deletionsoperationer på dokument som inte finns, kommer hela funktionen att misslyckas

const batch = db.batch();

    batch.delete(user1FollowingDocRef); //this doesn't exist
    batch.delete(user2FollowersDocRef); //this doesn't exist

    batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
    batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});


    return batch.commit();

Jag trodde att allt som är kopplat till batch bara skulle köras om alla operationer kan utföras framgångsrikt

Svar #1

Jag har haft ett liknande problem med FieldValue. Som Doug nämnde behöver du 'importera' FieldValue för att använda increment()-metoden.

Du kan göra detta direkt.

batch.update(user1DocRef, {followingNum : admin.firestore.FieldValue.increment(-1)});
batch.update(user2DocRef, {followersNum : admin.firestore.FieldValue.increment(-1)});

Eller så kan du definiera en konstant med ett kortare namn.

admin.initializeApp();
const db = admin.firestore();
const firestore = admin.firestore;
export const unfollowRemoveUser = functions.https.onCall((data, context) => {

    const user1id = data.user1
    const user2id = data.user2

    const user1DocRef = db.collection('users').doc(user1id)                 
    const user2DocRef = db.collection('users').doc(user2id)    

    const batch = db.batch();

    batch.update(user1DocRef, {followingNum : firestore.FieldValue.increment(-1)});
    batch.update(user2DocRef, {followersNum : firestore.FieldValue.increment(-1)});

    // Commit the batch
    return batch.commit().then(function () {
        // ...
    });


});

Relaterade artiklar