云功能身份验证触发器中的任务需要异步吗?

时间:2019-03-04 22:39:57

标签: firebase firebase-realtime-database firebase-authentication google-cloud-functions

声明

首先,我要说火力基地团队是最好的。

代码

    //Firebase Cloud Functions
    const functions = require('firebase-functions');    
    // Firebase Admin SDK
    const admin = require('firebase-admin');
    admin.initializeApp(); //initialize the admin sdk
    //UUID
    const uuidv1 = require('uuid/v1');

    exports.setupProfile= functions.auth.user().onCreate((user) => {
         const email = user.email; // The email of the user.
         const displayName = user.displayName; // The display name of the us
         const pid = uuidv1(); // public id

         //**************** 
         //create a set of items visible to others
         return admin.database().ref('/users-public/' + pid).push({"displayName": displayName,"profile-pic-path":""});

         //user's private information
         return admin.database().ref('/users-private/' + user.uid).push({"displayName": displayName, "pid": pid,"email":email,"dob": "","address": "","age": "","zip-code":""});
         //****************         

    });

我想完成/理解的事情

我正在研究一种逻辑,以在用户首次注册时创建用户配置文件脚手架/默认设置。

到目前为止我所了解的

身份验证触发器与所有其他背景功能一样,是异步的,这意味着如果人A和人B同时注册,并且上面的功能被同时触发,则人A和人B都不必等待对方的“ setupProfile”功能完成。本质上是两个不同的线程。

问题

  1. 星号之间的行是否必须在async()方法内部 整个过程真正是异步的,还是意味着将其放入async()本质上会从触发线程中产生另一个线程?
  2. 我不应该为async()烦恼,因为我应该将每个触发器视为自己的线程,因此该触发器中的任何任务都将成为该单个线程(初始触发器)的一部分,并且产生另一个线程没有任何额外的好处。我应该简单地兑现诺言并将其命名为一天。

如果需要清理,请告诉我。 -LK

工作代码

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(); //initialize the admi sdk
exports.setupProfile = functions.auth.user().onCreate((user, context) => {
    return Promise.all([
        admin.database().ref("/users-public/" + user.uid).set({ "displayName": ""}),
        admin.database().ref('/users-private/' + user.uid).set({ "displayName": "", "email": user.email, "phone": "", "dob": "", "address": "", "age": "", "zip-code": ""})
    ]).then((results)=> {
        console.log("New user: " + user.uid);
    });
});

1 个答案:

答案 0 :(得分:0)

您的代码(如图所示)将无法按预期运行,因为第一次返回将阻止第二次返回执行。

如果有两项不需要按顺序执行的异步工作,则应该将所有的Promise收集到一个数组中,并在该数组上使用Promise.all()

需要澄清的另一件事-Cloud Functions不处理JavaScript中的线程概念。每个功能仅执行异步工作,每个功能调用都在其自己的服务器实例中运行,与所有其他功能调用隔离。您可能需要watch my video对此进行详细说明。