Облачная функция Firebase - необработанная ошибка Ошибка: обновление () - PullRequest
2 голосов
/ 23 апреля 2019

У кого-нибудь есть подобная проблема при попытке сделать несколько обновлений пакетным способом? Вот моя функция:

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


    });

Что-то не так с моей функцией? Я делаю это так же, как в примере документации для пакетных записей. Я получаю эту ошибку:

Необработанная ошибка Ошибка: Update () требуется либо один объект JavaScript, либо чередующийся список пар поле / значение, за которым может следовать необязательное предварительное условие. Значение аргумента \ "dataOrField \" не является допустимым документом Firestore. Не удалось сериализовать объект типа \ "NumericIncrementTransform \" (находится в поле followNum). 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 at exports.unfollowRemoveUser.functions.https.onCall (/user_code/lib/index.js:131:11)\n в / user_code / node_modules / firebase -functions / lib / provider / https.js: 330: 32 \ n на следующем (родном) \ n на /user_code/node_modules/firebase-functions/lib/providers/https.js:28:71\n на __awaiter (/ user_code / node_modules / firebase-functions / lib / provider / https.js: 24: 12) \ n at func (/user_code/node_modules/firebase-functions/lib/providers/https.js:294:32)\n at corsHandler (/user_code/node_modules/firebase-functions/lib/providers/https.js:350:44)\n at cors (/user_code/node_modules/firebase-functions/node_modules/cors/lib/index.js:188:7) \ n в /user_code/node_modules/firebase-functions/node_modules/cors/lib/index.js:224:17"*100 7 *

Я искал и пробовал все, что мог найти, но не смог решить эту проблему, я даже пытался использовать простое обновление документа, но я получаю ту же ошибку.

EDIT Что я должен делать, когда я хочу, чтобы пакет выполнялся, только если все операции могут быть выполнены успешно. Пример: Если у меня есть первые два обновления для документов, которые существуют, они обновят эти значения на -1, а затем две операции удаления для документов, которые не существуют, это не вызовет ошибку в моей функции (значения будут обновлены на -1 и удалить ничего не сделаю)

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();

Но если у меня сначала есть две операции удаления для документов, которые не существуют, вся функция завершится ошибкой

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();

Я думал, что все, что прикреплено к пакету, будет выполнено, только если все операции могут быть успешно выполнены

1 Ответ

4 голосов
/ 24 апреля 2019

У меня была похожая проблема с FieldValue. Как упоминал Дуг, вам нужно «импортировать» FieldValue, чтобы использовать метод increment().

Вы можете сделать это встроенным.

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

Или вы можете определить константу с более коротким именем.

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


});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...