简体   繁体   中英

How to resolve error "Value for argument "dataOrField" is not a valid Firestore document" while using firestore.FieldValue.increment(1)?

I am performing a simple operation where in im trying to increment the count of a field. the code is below:

import * as firebase from 'firebase';

const DocumentRef = db.doc(`pages/${request.params.pageId}`);

const increment = firebase.firestore.FieldValue.increment(1);

DocumentRef
    .get()
    .then(function (documentSnapshot) {
        if(!documentSnapshot.exists){
            return response.status(404).json({"message":"page not found"})
        }else{
            return db.collection(`comments`).add(newComment)
        }
    })
    .then(()=>{
        return DocumentRef.update({nComments: increment})
    })
    .then(() => {
        response.status(200).json(newComment);
    })
    .catch((error) => {
        console.log(error)
        return response.status(500).json({message:error.code});
    })

ending up in following error:

Error: Update() requires either a single JavaScript object or an alternating list of field/value pairs that can be followed by an optional precondition. Value for argument "dataOrField" is not a valid Firestore document. Couldn't serialize object of type "FieldValueDelegate" (found in field "nComments"). Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the "new" operator).
    at WriteBatch.update (/srv/node_modules/@google-cloud/firestore/build/src/write-batch.js:374:23)
    at DocumentReference.update (/srv/node_modules/@google-cloud/firestore/build/src/reference.js:377:14)
    at screamDocumentRef.get.then.then (/srv/lib/handlers/screams.js:105:34)
    at <anonymous> 

The message is:

Update() requires either a single JavaScript object or an alternating list of field/value pairs that can be followed by an optional precondition. Value for argument "dataOrField" is not a valid Firestore document. Couldn't serialize object of type "FieldValueDelegate" (found in field "nComments"). Firestore doesn't support JavaScript objects with custom prototypes (ie objects that were created via the "new" operator).

this error happens only when I add this "then" chain:

.then(()=>{
        return DocumentRef.update({nComments: increment})
    })

I do not understand why.

only relevant part of the schema, I've 2 collections.

   collection: pages(nComments, body, etc)    id: pageId 
   collection: comments(pageId, etc)          id: commentId

when new comment document is added in comments collection, Im updating the count in pages collections document whose pageId is in comment documents pageId field.

nComments and pageId are fields.

You're probably using admin namespace to do the update while using increment from the firebase namespace. Try changing your increment statement to:

import * as admin from 'firebase-admin';
const increment = admin.firestore.FieldValue.increment(1);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM