【问题标题】:Error snap.data is not a function with firebase cloud function and onCreate错误 snap.data is not a function with firebase cloud function and onCreate
【发布时间】:2020-04-07 20:30:36
【问题描述】:

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

该函数正确执行所有操作,发送电子邮件,收件人收到这些邮件,到目前为止,一切正常。

当我在函数中手动写入电子邮件地址时它可以工作,但是当我希望它从实时数据库中获取数据时,它给了我错误:

TypeError:snap.data 不是函数

这是我的函数的代码:

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

这是我的实时数据库:

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

使用const _name = snap.val().name; 我得到同样的错误

我不确定是什么失败了。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你有一个错字。您声明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;
          ...
      

      【讨论】:

      • 是抄写错误,我真的声明了snap,我也指snap。我在代码中更正了它,谢谢。即使进行了这种更正,它仍然不起作用。
      • 接下来:实时数据库快照中没有 data() 成员,因为 data() 是一种仅存在于 Firestore API 中的方法。您正在寻找snapshot.val()。我知道你说你已经尝试过了,但不幸的是你没有分享你这样做时出了什么问题,而且你显示的错误消息是关于 snap.data()
      • 这很奇怪..如果我使用 const _name = snap.val().name;我犯了同样的错误。我只是再次尝试确定。添加问题的更新
      • 请不要说“同样的错误”之类的话,但要具体,并将日志中的确切错误复制/粘贴到您的问题中。另外:请不要发布文字内容的图片,而是发布实际文本并使用 Stack Overflow 的格式化工具进行标记。
      • 好的,抱歉。当说同样的错误时,我指的是 TypeError: snap.data is not a function, just the picture of the question.
      【解决方案3】:

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

      但是,我在 cmets 中告诉过你我一直返回错误的答案。

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

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

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

      感谢大家的帮助

      【讨论】: