Firebase Cloud Function事务在Firestore上写入会引发等待错误 [英] Firebase Cloud Function Transaction write on firestore throws await as an error

查看:76
本文介绍了Firebase Cloud Function事务在Firestore上写入会引发等待错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I try to carry out a transaction on firestore, it throws me an error Unexpected token admin on the below code

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时遇到的错误

Here is the Error I got while deploying the 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块

this is the try block which throws the error

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'
        );
    }

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

What is the reason for this Error? Thanks in Advance.

推荐答案

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

You are trying to use await inside a function that is not declared async. The function is the anonymous function/lambda that you're passing to forEach. The async on the outer function doesn't matter at all here. async/await doesn't work with nested lambda functions.

请考虑一些有关如何在forEach循环中使用异步/等待的想法:将async/await与forEach循环一起使用

Consider some ideas on how to work with async/await in forEach loops: Using async/await with a forEach loop

这篇关于Firebase Cloud Function事务在Firestore上写入会引发等待错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆