【问题标题】:Task inside Cloud Functions Authentication trigger needs async?Cloud Functions 身份验证触发器中的任务需要异步吗?
【发布时间】:2019-07-26 07:46:48
【问题描述】:

声明

首先,我只想说 firebase 团队是最好的。

代码

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

【问题讨论】:

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


    【解决方案1】:

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

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

    要澄清的另一件事 - Cloud Functions 不处理 JavaScript 中的线程概念。每个函数只执行异步工作,每个函数调用在其自己的服务器实例中运行,与所有其他函数调用隔离。您可能想watch my video 更详细地解释这一点。

    【讨论】:

    • 嘿@doug-stevenson - 感谢您的快速回复! facepalm 你说得对,第二次回归将永远见不到曙光。很好的建议。我一回家就开始工作。
    • 好的,没有线程,但我是否可以假设如果两个用户同时注册,那么该功能将为这两个用户同时触发?我看过你所有的视频,它们是很好的学习资源。这些一定是新的,迫不及待地想看它们,但是在工作和个人项目之间,我正在用 7 到 8 种语言进行编码,并解决了 5 到 6 倍的问题。很难跟踪所有内容。完成后我将分享我的代码。再次感谢!
    • 您应该假设两个函数调用可能同时运行。对此没有任何保证,只是做出假设。
    • 嘿 @doug-stevenson 我有 5 个不同的后台函数,它们都在使用 admin.database().ref() 方法。在页面顶部创建一个全局变量const database = admin.database(); 有意义吗?我是否会看到性能提升,例如每次我指向数据库引用时调用 admin.database.ref() 的负担有多大?
    • 不是很贵。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2018-07-09
    • 2018-07-23
    • 1970-01-01
    • 2020-10-25
    • 2018-01-22
    • 2020-09-17
    • 2019-04-04
    相关资源
    最近更新 更多