错误snap.data不是具有Firebase Cloud函数和onCreate的函数

时间:2019-12-14 19:54:31

标签: node.js firebase-realtime-database google-cloud-functions nodemailer

我有一个云功能,每次新用户在数据库中注册时都会发送一封欢迎电子邮件。

该函数可以正确执行所有操作,发送电子邮件,并且收件人可以接收这些电子邮件,到目前为止,一切都很好。 当我在函数中手动写入电子邮件地址时,它可以工作,但是当我希望它从实时数据库中获取数据时,它会给我错误:

TypeError:snap.data不是函数

enter image description here

这是我函数的代码:

const functions = require('firebase-functions');
const nodemailer = require("nodemailer");


const transport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "MY_EMAIL",
        pass: "MY_EMAIL_PASSWORD"
    }
})

exports.welcomeMail = functions.database.ref('/paso1/{id}').onCreate((snap, context) => {

    const _name = snap.data().name;

    return sendWelcomeMail(_name)

});

// aux functions

function sendWelcomeMail(name) {

    return transport.sendMail({
        from: "JohnDoe <sender@test.com>",
        to: "myfriendemail@gmail.com",
        subject: "Hello",
        html: `
        <h1<Hello ${name} </h1>
        <p>nice to seeyou</p>
        `
    })
        .then(r => r)
        .catch(e => e);
}

这是我的实时数据库:

enter image description here

我已经多次阅读文档,并使用snap.val(),{uid};进行了测试。但一切都没有成功,我无法从数据库中恢复“名称”字段。

我不确定是什么失败还是表现良好。

非常感谢。

更新

使用const _name = snap.val()。name;我收到相同的错误

enter image description here

3 个答案:

答案 0 :(得分:1)

您要查找的方法是snap.val(),而不是snap.data()。您可能将Realtime Database与Firestore混淆了。 Firestore使用data()从DocumentSnapshot中获取原始数据,但这与实时数据库不同。

答案 1 :(得分:0)

您有错字。您声明snap,然后将其称为snapshot。要解决此问题,请确保声明并使用匹配项。

您还使用snapshot.data(),而实时数据库快照中不存在data()(您可能会将其与Cloud Firestore混淆了)。

因此,结合这两个修复程序,这应该更加接近:

exports.welcomeMail = functions.database.ref('/paso1/{id}')
  .onCreate((snapshot, context) => { // this line changed

    const _name = snapshot.val().name;
    ...

答案 2 :(得分:0)

我终于发现了错误所在。 确实,正如您向我指示的那样,从实时数据库提取数据的正确方法是使用.val()

但是,我在评论中告诉您我一直在返回错误。

这没有用,因为我没有将firebase SDK初始化为ADMIN,而ADMIN是访问实时数据库所必需的。

https://firebase.google.com/docs/admin/setup

我希望我的错误可以节省其他程序员的时间。

感谢所有人的帮助