代码之家  ›  专栏  ›  技术社区  ›  Daniel Watrous

Firebase云函数多次执行

  •  2
  • Daniel Watrous  · 技术社区  · 7 年前

    我有一个firebase(Google)云功能,如下所示

    // 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 ,则函数可以工作,但显然没有 用户信息 .

    你知道为什么这个函数的某些部分会执行多次,为什么有些调用会失败吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Prisoner    7 年前

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

    但这并不能解释为什么回调会被调用两次——一次是使用有效的 用户信息 还有一次 err . 文档(尽管不是示例) AuthenticationClient.getProfile() 表示它返回承诺(或 未定义 -虽然它没有说为什么它会回来 未定义 ),所以我想知道这是否会导致两次回调。

    由于它返回一个承诺,您可以省略回调函数,只需使用如下方式处理它:

    function getAccountBalance(app) {
        let accountowner = app.getArgument(PARAM_ACCOUNT_OWNER);
        console.log('accessToken: ' + app.getUser().accessToken);
        var accessToken = app.getUser().accessToken;
        auth0.getProfile( accessToken )
    
          .then( userInfo => {
            console.log('getAccountBalance userInfo:' + userInfo)
    
            // query firestore based on user
            var transactions = db.collection('bank').doc(userInfo.email)
                              .db.collection('accounts').doc(accountowner)
                              .collection('transactions');
            return 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.error('Error:', err );
            app.tell('I was unable to retrieve your balance at this time.')
          })
    
        });
    }