облачная функция firebase возвращает объект json из пакетной функции - PullRequest
0 голосов
/ 20 октября 2019

Я хотел бы вернуть клиенту объект Json {mesage: "это то, что я хочу вернуть"} из пакетной операции ... Чего мне здесь не хватает?

exports.addMessage3 = functions.https.onCall(async (data, context) => {
    const db = admin.firestore();

    const query = db
        .collection('smtg')
        .where('status', '==', false)
        .limit(1);

    return db
        .runTransaction(async transaction => {
            return transaction
                .get(query)
                .then((querySnapshot) => {
                    const snapshot = querySnapshot.docs[0];

                    if (typeof snapshot === "undefined") {
                        console.log('XXXXXXXX!  ', snapshot);
                        const xyz = myFunction()

                        console.log('XXXXXXXXZZZZZZ!  ', xyz);
                        return { error: "undefined" };
                    }
                    const data = snapshot.data();
                    console.log('LLLoooog!  ', data);
                    transaction.update(snapshot.ref, { status: true });
                    return data;
                })
        })
        .then((data) => {
            console.log('Transaction successfully committed!  ', data);
            return data;
        })
        .catch((error) => {
            console.log('Transaction failed:  ', error);
            return error;
        });
});




async function myFunction() {
    const db = admin.firestore();
    let batch = admin.firestore().batch();

    let nycRef = db.collection('smtg').doc();
    batch.set(nycRef, { combination: 'ABC11', status: false });

    return batch.commit().then(function () {
        console.log('Batched.');
        return {mesage: "this is what I want to return"}
    });
}

В случае, когда снимок не определен, я бы хотел вернуть myFunction () и не вернуть {error: "undefined"}

1 Ответ

0 голосов
/ 23 октября 2019

Понял, что я не могу вызвать пакет в середине транзакции, я могу вызвать его из блока .then((data). Итак, что я сделал:

exports.addMessage3 = functions.https.onCall(async (data, context) => {
    const db = admin.firestore();

    const query = db
        .collection('smtg')
        .where('status', '==', false)
        .limit(1);

    return db
        .runTransaction(async transaction => {
            return transaction
                .get(query)
                .then((querySnapshot) => {
                    const snapshot = querySnapshot.docs[0];
                    if (typeof snapshot === "undefined") {
                        return snapshot;
                    }
                    const data = snapshot.data();
                    console.log('LLLoooog!  ', data);
                    transaction.update(snapshot.ref, { status: true });
                    return data;
                })
        })
        .then((data) => {
            console.log('Transaction successfully committed!  ', data);
            if (typeof data === "undefined") {
                    return myFunction();
            }
            return data;
        })
        .catch((error) => {
            console.log('Transaction failed:  ', error);
            return error;
        });
});




async function myFunction() {
    const db = admin.firestore();
    let batch = admin.firestore().batch();

    let nycRef = db.collection('smtg').doc();
    batch.set(nycRef, { combination: 'ABC11', status: false });

    return batch.commit().then(function () {
        console.log('Batched.');
        return {mesage: "this is what I want to return"}
    });
}

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