Firebase Cloud Function事务在Firestore上写入会引发等待错误

时间:2020-04-13 02:27:48

标签: javascript firebase google-cloud-firestore async-await google-cloud-functions

当我尝试在Firestore上进行交易时,它在以下代码上抛出了错误Unexpected token admin

exports.issueBook = functions.https.onCall(async(data, context) => {
    if (!(context.auth && context.auth.token.admin)) {
        throw new functions.https.HttpsError(
            'unauthenticated',
            'only authenticated Admins can Issue Books'
        );
    }

    memberData = {
        name: data.issueData.memberName,
        no: data.issueData.memberNo,
        role: data.issueData.memberRole,
    }
    transactionData = {
        books: data.issueData.books,
        creation: new Date(),
        member: memberData,
    }

    var keys = Object.keys(transactionData.books);
    var date = new Date();
    transactionData.books["takenDate"] = date;
    date.setDate(date.getDate() + 7);
    var dueDate = date;
    if (transactionData.memberRole == "student") {
        transactionData.books["dueDate"] = dueDate;
    }

    const membeRef = admin.firestore().collection('users').doc(transactionData.member.no);
    var memberDoc = await membeRef.get();
    if (!memberDoc.exists) {
        try {
            await memberRef.set({
                name: data.issueData.memberName,
                no: data.issueData.memberNo,
                email: data.issueData.memberEmail,
                role: data.issueData.memberRole,
                created: data.issueData.created,
                totalBooks: 5,
            })
        } catch (error) {
            console.log(error);
            throw new functions.https.HttpsError(
                'unknown',
                'New user cannot be created at the moment due to some unknown reasons. Please try again'
            );
        }
    } else {
        if (memberDoc.data().role == 'student' && keys.length > memberDoc.data().totalBooks) {
            throw new functions.https.HttpsError(
                'failed-precondition',
                'Student cannot have more than 5 Books'
            );
        }
    }

    var transactionBooks = [];

    try {
        keys.forEach(docNo => {
            book = await admin.firestore().collection('books').where("no", "==", docNo).limit(1);
            transactionBooks.push(book);
        })
    } catch (error) {
        console.log(error);
        throw new functions.https.HttpsError(
            'unknown',
            'Book Data cannot be read at the moment. Please try again'
        );
    }

    return admin.firestore().runTransaction(transaction => {
            return transaction.get(memberRef).then(doc => {
                var transactionRef = admin.firestore().collection('transactions').doc();
                var transId = '';
                // write Transaction
                transaction.set(transactionRef, transactionData)
                    .then(() => { transId = transactionRef.id })
                    .catch(error => {
                        console.log(error);
                        throw new functions.https.HttpsError(
                            'unknown',
                            'New user cannot be created at the moment due to some unknown reasons. Please try again'
                        )
                    })

                transaction.set(memberRef, {
                    transactionId: transId
                }, { merge: true })

                transaction.update(membeRef, {
                    totalBooks: totalBooks - keys.length
                });

                transactionBooks.forEach(transBook => {
                    transaction.update(transBook, {
                        status: false
                    })
                })


            })
        })
        .then(result => {
            console.log(result);
            return { message: 'Issued' };
        })
        .catch(error => {
            console.log(error);
            return error;
        });
});

这是我部署CF时遇到的错误

=== Deploying to 'library-1be0e'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /home/abibv/Downloads/Development/PDL Library/Nec-it-Library-PWA/functions
> eslint .


/home/abibv/Downloads/Development/PDL Library/Nec-it-Library-PWA/functions/index.js
  150:26  error  Parsing error: Unexpected token admin

✖ 1 problem (1 error, 0 warnings)

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! functions@ lint: `eslint .`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the functions@ lint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/abibv/.npm/_logs/2020-04-13T02_13_51_548Z-debug.log

Error: functions predeploy error: Command terminated with non-zero exit code1

Having trouble? Try firebase [command] --help

这是引发错误的try块

try {
        keys.forEach(docNo => {
            book = await admin.firestore().collection('books').where("no", "==", docNo).limit(1);
            transactionBooks.push(book);
        })
    } catch (error) {
        console.log(error);
        throw new functions.https.HttpsError(
            'unknown',
            'Book Data cannot be read at the moment. Please try again'
        );
    }

此错误的原因是什么?预先感谢。

1 个答案:

答案 0 :(得分:1)

您正试图在未声明为await的函数中使用async。该函数是您要传递给forEach的匿名函数/ lambda。外部函数上的async在这里根本不重要。 async / await不适用于嵌套的lambda函数。

考虑一些有关如何在forEach循环中使用异步/等待的想法:Using async/await with a forEach loop