Firebase云功能-未处理的错误错误:Update()

Ale*_*len 3 firebase typescript google-cloud-functions google-cloud-firestore

尝试批量执行多个更新时,有人会遇到类似的问题吗?这是我的功能:

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


    });
Run Code Online (Sandbox Code Playgroud)

我的功能有问题吗?我这样做就像在批处理写入的文档示例中一样。我收到此错误:

未处理的错误错误:Update()需要单个JavaScript对象或字段/值对的交替列表,其后可以是可选的前提条件。参数\“ dataOrField \”的值不是有效的Firestore文档。无法序列化类型为“ NumericIncrementTransform \”的对象(可在字段followingNum中找到)。Firestore不支持带有自定义原型的JavaScript对象(即通过\“ new \”运算符创建的对象)。\ n位于WriteBatch.update(/ user_code / node_modules / firebase-admin / node_modules / @ google-cloud / firestore /build/src/write-batch.js:367:23)\n在export.unfollowRemoveUser.functions.https.onCall(/user_code/lib/index.js:131:11)\n在/ user_code / node_modules / firebase -functions / lib / providers / https.js:330:

我搜索并尝试了所有可以找到的但无法解决此问题的方法,甚至尝试对文档使用简单的更新,但出现相同的错误。

编辑 如果要让批处理仅在所有操作都可以成功执行的情况下执行,该怎么办。示例:如果我对确实存在的文档进行前两次更新,它们将以-1更新这些值,然后对不存在的文档进行两次删除操作,这不会对我的函数造成错误(值将由更新-1和delete不会执行任何操作)

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();
Run Code Online (Sandbox Code Playgroud)

但是,如果我首先对不存在的文档执行两次删除操作,则整个功能将失败

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();
Run Code Online (Sandbox Code Playgroud)

我认为,只有成功完成所有操作后,批处理中附加的任何内容才会执行

Seb*_*ebe 5

我也有类似的问题FieldValue。正如道格所说,您需要“导入” FieldValueincrement()方法。

您可以内联进行。

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

或者,您可以使用更短的名称定义一个常量。

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


});
Run Code Online (Sandbox Code Playgroud)