1

我创建了一个 Firebase 云函数,它将在数据更新时触发。当我进入 Firebase 控制台并将节点更改为 true 或 false 时,它​​会触发并且我会收到一封来自我的 SendGrid 设置的电子邮件。问题是我无法获取用户的电子邮件信息。

我花了一个多星期的时间翻阅文档,它说我应该能够使用 context.auth,但是,当在控制台中打印出来时,它总是“未定义”。

我一直在尝试从 Firebase 以及 /users/{uid}/email 中的用户实际信息中获取用户数据。我似乎无法弄清楚如何获取电子邮件,因为快照位于不同的位置。

我需要以某种方式提取用户的名字和电子邮件,它们位于:/users/uid/first_name 和 /users/uid/email

我希望将这两件事放入这个函数中,这样我就可以告诉 SendGrid 使用电子邮件和姓名。Sendgrid 部分工作正常。

context.params.uid 给了我用户的firebase ID,但对我没有任何作用。我似乎无法使用它来获取我需要的数据

我尝试了 authVar = context.auth,当我打印出来时,它显示“未定义”并且我的函数停止工作。

exports.myFunctionPending = 
functions.database.ref('/users/{uid}/profile/isPending')
.onUpdate(async (change, context) => {
    const snapshot = change.after;
    const val = snapshot.val();
    const userid = context.params.uid;  //shows userid but is useless
    const authVar = context.auth;  //says undefined and does nothing

    console.log(val);
    console.log(userid);

               const msg = {
                    to: 'myemail@mydomain.com',
                    from: 'noreply@mydomain.com',

                    // custom templates
                    templateId: 'd-b7aakjsdgwq7d798wq7d8',
                    substitutionWrappers: ['{{', '}}'],

                    //substitutions: {
                    dynamic_template_data: {
                    //name: user.displayName
                      name: 'My Name'

                    }
                };
 try {
   await sgMail.send(msg);
   console.log('This was sucessful');
 } catch(error) {
   console.error('There was an error while sending the email:', error);
 }
 return null;
});
4

1 回答 1

0

我把代码放在不正确的位置,我改变了逻辑,现在它按预期工作了。

exports.myFunction = functions.database.ref('/users/{uid}/user_area/pending')
    .onUpdate(async (change, context) => {
        const triggersnapshot = change.after;
        const val = triggersnapshot.val();
        const userid = context.params.uid;

        console.log(val);
        console.log(userid);

        return admin.database().ref('users/' + userid).once('value').then(function (snapshot) {
            var email = snapshot.child('email');
            var name = snapshot.child('first_name');
            console.log(snapshot.val());
            console.log(email.val());

            const msg = {
                to: [email],
                from: {
                    email: 'noreply@noreply.com',
                    name: 'No Name'
                },
                // custom templates
                templateId: 'd-8347983274983u483242',
                substitutionWrappers: ['{{', '}}'],
                dynamic_template_data: {
                    name: name
                }
            };
            return sgMail.send(msg);

        });
于 2019-09-18T23:46:14.983 回答