Firebase云功能多次执行

时间:2018-01-05 17:56:30

标签: node.js firebase google-cloud-functions auth0

我有一个firebase(谷歌)云功能如下

// Initialize the Auth0 client
var AuthenticationClient = require('auth0').AuthenticationClient;
var auth0 = new AuthenticationClient({
    domain:       'familybank.auth0.com',
    clientID:     'REDACTED'
});

function getAccountBalance(app) {
    console.log('accessToken: ' + app.getUser().accessToken);
    auth0.getProfile(app.getUser().accessToken, function (err, userInfo) {
        if (err) {
            console.error('Error getting userProfile from Auth0: ' + err);
        }
        console.log('getAccountBalance userInfo:' + userInfo)

        let accountowner = app.getArgument(PARAM_ACCOUNT_OWNER);

        // query firestore based on user
        var transactions = db.collection('bank').doc(userInfo.email)
                          .db.collection('accounts').doc(accountowner)
                          .collection('transactions');
        var accountbalance = transactions.get()
            .then( snapshot => {
                var workingbalance = 0
                snapshot.forEach(doc => {
                    workingbalance = workingbalance + doc.data().amount;
                });

                app.tell(accountowner + " has a balance of $" + workingbalance)
            })
            .catch(err => {
                console.log('Error getting transactions', err);
                app.tell('I was unable to retrieve your balance at this time.')
            });
    });
}
actionMap.set(INTENT_ACCOUNT_BALANCE, getAccountBalance);
app.handleRequest(actionMap);

执行此操作时,我会看到以下日志

enter image description here

请注意,部分函数正在执行多次,第二次执行失败。如果我在记录auth0.getProfile后关闭userInfo来电,则该功能有效,但显然没有userInfo

知道为什么这个函数的某些部分正在执行多次以及为什么某些调用会失败?

1 个答案:

答案 0 :(得分:1)

{(1}}在点(2)处未定义,因为出现了错误(在其下方的行上报告,这是之前记录的消息)。您的错误块不会离开该函数,因此它将继续使用无效的userInfo对象运行。

但这并不能解释为什么回调被调用两次 - 一次使用有效userInfo,一次使用userInfoerr的文档(虽然不是示例)表示它返回Promise(或 undefined - 虽然它没有说明为什么它可能会返回 undefined ),所以我想知道这是否最终会两次调用回调。

因为它返回一个promise,你可以省略回调函数,只需用以下代码处理它:

AuthenticationClient.getProfile()