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 () {
// ...
});
});
